c中非常大的循环计数

时间:2014-02-25 15:52:36

标签: c loops for-loop while-loop

如何在c中为c中的非常大的计数运行循环,例如。 2 ^ 1000次?

另外,使用两个运行a和b no的循环。有时候,我们会得到一个运行a * b no的结果块。时间。是否有任何智能方法来运行循环a ^ b次?

5 个答案:

答案 0 :(得分:2)

你可以递归循环,例如

void loop( unsigned a, unsigned b ) {
    unsigned int i;
    if ( b == 0 ) {
        printf( "." );
    } else {
        for ( i = 0; i < a; ++i ) {
            loop( a, b - 1 );
        }
    }
}

...将打印^ b .个字符。

答案 1 :(得分:1)

虽然我无法回答你的第一个问题,(虽然查看libgmp,这可能会帮助你处理大数字),这是一种执行动作的方法a ^ b次使用递归。

function (a,b) {
   if (b == 0) return;
   while (i < a) {
     function(a,b-1);
   }
}

这将为每个步骤执行一次循环,直到b等于0.

答案 2 :(得分:1)

关于您对其中一条评论的回答: 但如果我有两行输入和2 ^ n行垃圾,我该怎么办跳过它们?你能告诉我一个真实的生活场景,你会看到2 ^ 1000行垃圾你必须监控吗?

对于更合理(更小)的输入数 ,您可能能够解决您真正需要的声音(即只处理相关的输入线) ,不是通过迭代索引,而是通过简单地检查相关组件的每一行,因为它是在while循环中处理的......

伪代码:

BOOL criteriaMet = FALSE;
while(1)
{
    while(!criteriaMet)
    {
         //test next line of input
         //if criteria met, set criteriaMet = TRUE;
         //if criteria met, handle line of input
         //if EOF or similar, break out of loops
    }
    //criteria met, handle it here and continue
    criteriaMet = FALSE;//reset for more searching...

}

答案 3 :(得分:0)

使用b大小的数组i[],其中每个单元格保存从0a-1的值。例如 - 对于2^3,使用3个大小的布尔数组。

每次迭代。增加i[0]。如果a==i[0],请将i[0]设置为0并增加i[1]。如果0==i[1],请将i[1]设置为0并增加i[2],依此类推,直到您递增单元格而不会达到a。这可以很容易地循环完成:

for(int j=0;j<b;++j){
    ++i[j];
    if(i[j]<a){
        break;
    }
}

a次迭代后,i[0]将返回零。在a^2次迭代后,i[0]i[1]都将为零。在a^b次迭代后,所有单元格都为0,您可以退出循环。您不需要每次都检查数组 - 重置i[b-1]时您知道所有数组都回零。

答案 4 :(得分:0)

你的问题没有意义。即使你的循环是空的,你也很难每秒进行超过2 ^ 32次迭代。即使在这种最佳情况下,处理2 ^ 64循环迭代,您可以使用简单的uint64_t变量进行处理需要136年。这是循环什么都没做的时候。

同样的事情是跳过线,你后面在评论中解释。跳过或计算文本中的行是计算换行符的问题。据估计,2006年世界上有大约10 * 2 ^ 64字节的存储空间。如果我们假设世界上的所有数据都是文本(它不是)并且平均线是包含换行符的10个字符(可能不是),那么您仍然可以适应所有数据中的行数在世界上uint64_t。即使您的CPU的缓存直接来自4个10Gbps网络接口,这个处理当然仍需要至少136年(因为您的机器可能拥有那么多磁盘是不可想象的)。

换句话说,你认为你正在解决的任何问题都不是循环问题,而不是C中可以处理的正常uint64_t。在您的代码可以运行的任何硬件上,2 ^ n中的n不能合理地超过50-55。

所以回答你的问题:如果循环uint64_t对你来说还不够,你最好的选择是等待至少30年,直到摩尔定律赶上你的问题然后解决问题。它会比现在尝试开始运行程序更快。我相信我们当时会有uint128_t