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
}
现在,基于某些条件检查,我需要在范围之间打印 i
:3*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
作为其数字),只有数字的某些表示形式有数字。
那你应该只考虑3
或5
的字符串,小于12个字符,而且你有更少的字符串(小于10000,可能小于213 即 8192);迭代一万次应该很快。因此,生成小于例如的每个字符串15个字符,只有3
和5
,测试是否正经。
假设我有以下代码来循环数字:
int p;
cin>>p;
for(unsigned long long int i=3*pow(10,p);i<6*pow(10,p);i++){
//some code goes here
}
现在,基于某些条件检查,我需要在范围之间打印 i
:3*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
作为其数字),只有数字的某些表示形式有数字。
那你应该只考虑3
或5
的字符串,小于12个字符,而且你有更少的字符串(小于10000,可能小于213 即 8192);迭代一万次应该很快。因此,生成小于例如的每个字符串15个字符,只有3
和5
,测试是否正经。