在10^10到10^11之间的数字的数据类型应该是什么

What should be the data type for numbers in between the range of 10^10 - 10^11?

本文关键字:是什么 数据类型 之间 数字      更新时间:2023-10-16

假设我有以下代码来循环数字,如下所示:

 int p;
 cin>>p;
 for(unsigned long long int i=3*pow(10,p);i<6*pow(10,p);i++){
              //some code goes here
 }

现在,根据某些条件检查,我需要打印介于范围3*pow(10,p)<= i <6*pow(10,p) 之间的i

代码在upto p=8上运行良好,然后变得相当缓慢,编译器似乎在p=9,10,11及以后的版本中陷入了困境。我猜问题出在使用正确的数据类型上。这里应该使用什么样的正确数据类型?

这个循环的目的是在这个范围内找到合适的数字。体面的数字条件如下:1) 3、5或两者都作为其数字。不允许使用其他数字。2) 3出现的次数可以被5整除。3) 5出现的次数可被3整除。

注意:我在此处使用了unsigned long long int (0 to 18,446,744,073,709,551,615)。我在32位机器上运行

您可以使用<cstdint>及其int64_t(保证有64位),并且您应该计算循环外部的功率;并且CCD_ 9在最近的C或C++标准中具有至少64位。

但是,正如1201ProgramAlarm的评论中所提到的,即使在我们的快速机器上,3e11(即3000亿)循环也很多。这可能需要几分钟或几个小时:一个基本操作需要一纳秒(或一半)。3e9操作需要几秒钟;3e11操作需要几分钟时间。循环体可以执行数千(甚至更多)基本操作(即机器代码指令)。

陷入困境的不是编译器:编译代码既简单又快速(只要程序大小合理,例如代码少于一万行,没有奇怪的预处理器或模板扩展技巧病态地扩展它们)。它是运行已编译可执行文件的计算机。

如果您对代码进行基准测试,不要忘记在编译器中启用优化(例如,如果使用GCC,则使用g++ -Wall -O2 -arch=native进行编译…)

您应该更多地思考您的问题,并重新制定它以获得更小的搜索空间。

事实上,你体面的数字可能更多地被认为是代表它们的一串数字;毕竟,一个数字没有数字(特别是用二进制或三进制表示的数字不能有3作为其数字),只有数字的某些表示有数字。

然后,您应该只考虑短于12个字符的35的字符串,并且它们的数量要少得多(小于10000,可能小于213,即8192);迭代一万次应该很快。因此,生成每个小于例如15个字符的字符串,其中只有35,并测试它是否合适。