如何在c中为c中的非常大的计数运行循环,例如。 2 ^ 1000次?
另外,使用两个运行a和b no的循环。有时候,我们会得到一个运行a * b no的结果块。时间。是否有任何智能方法来运行循环a ^ b次?
答案 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[]
,其中每个单元格保存从0
到a-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
。