10^10 - 10^11 范围内的数字的数据类型应该是什么?

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

假设我有以下代码来循环数字:

 int p;
 cin>>p;
 for(unsigned long long int i=3*pow(10,p);i<6*pow(10,p);i++){

              //some code goes here
 }

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

代码工作正常 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 位)并且您应该计算循环的 outside 的幂; long long 在最近的 C 或 C++ 标准中至少有 64 位。

但是,正如 1201ProgramAlarm, 3e11 (i.e. 300 billions) loops is a lot, even on our fast machines. It could take minutes or hours: an elementary operation is needing a nanosecond (or half of it). 3e9 operations need several seconds; 3e11 operations need several minutes. Your loop body could do several thousands (or even more) elementary operations (i.e. machine code 说明中的评论所述)。

卡住的不是编译器:编译代码简单快捷(只要程序大小合理,例如少于一万行代码,没有怪异的预处理器或模板扩展技巧来扩展它们病理学)。它是计算机运行编译后的可执行文件。

如果您对代码进行基准测试,请不要忘记启用 optimizations in your compiler (e.g. compiling with g++ -Wall -O2 -arch=native if using GCC...)

你应该对你的问题进行更多思考并重新表述它以使其具有更小的search space

实际上,您的体面数字可能更像是代表它们的一串数字;毕竟,number 没有数字(特别是用二进制或三元表示法表示的数字不能有 3 作为其数字),只有数字的某些表示形式有数字。

那你应该只考虑35的字符串,小于12个字符,而且你有更少的字符串(小于10000,可能小于213 即 8192);迭代一万次应该很快。因此,生成小于例如的每个字符串15个字符,只有35,测试是否正经。