0

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

 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 位机器上运行。

4

1 回答 1

2

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

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

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

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

您应该更多地考虑您的问题,并重新制定它以具有更小的搜索空间

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

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

于 2015-11-06T05:23:32.010 回答