假设我有以下代码循环数字,如下所示:
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)
使用了SELECT DISTINCT nmc_cd.CDPrice FROM nmc_cd
。我正在使用 32位计算机 。
答案 0 :(得分:2)
你可以使用<cstdint>
及其int64_t
(保证有64位),你应该计算循环的外;在最近的C或C ++标准中,long long
至少 64位。
但是,如1201ProgramAlarm的评论所述,3e11(即300亿)循环很多,即使在我们的快速机器上也是如此。这可能需要几分钟或几小时:基本操作需要一纳秒(或一半)。 3e9操作需要几秒钟; 3e11操作需要几分钟。你的循环体可以做几千(甚至更多)基本操作(即machine code指令)。
编译器不是卡住的:编译代码很容易和快速(只要程序有合理的大小,例如少于一万行代码,没有奇怪的预处理器或模板扩展技巧在病理上扩展它们) 。它是运行已编译可执行文件的计算机。
如果您对代码进行基准测试,请不要忘记在编译器中启用optimizations(例如,如果使用GCC,则使用g++ -Wall -O2 -arch=native
进行编译...)
你应该对你的问题进行更多思考并重新制定它以使search space更小。
实际上,你的体面数字可能更多地被认为是代表它们的数字串;毕竟,number没有数字(特别是以二进制或三进制表示的数字不能将3
作为其数字),只有数字的某些表示具有数字。
然后你应该只考虑短于12个字符的3
或5
的字符串,并且你的字符串少得多(少于10000,可能少于2 13 即8192);迭代一万次应该很快。因此生成小于例如的每个字符串15个字符,其中只有3
和5
,并测试它是否合适。