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

时间:2015-11-06 05:21:14

标签: c++ types 32bit-64bit unsigned-long-long-int

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

 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)使用了SELECT DISTINCT nmc_cd.CDPrice FROM nmc_cd 。我正在使用 32位计算机

1 个答案:

答案 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个字符的35的字符串,并且你的字符串少得多(少于10000,可能少于2 13 即8192);迭代一万次应该很快。因此生成小于例如的每个字符串15个字符,其中只有35,并测试它是否合适。