我希望在所有可能的n ^ n个n ^ n状态中有一个C循环。例如,如果n = 4,我想循环遍历0000,0001,0010,1211,...,1110,1111。这些位可以以任何方式表示,例如长度为n且值为0的整数数组或1,或者长度为n的字符数组,其值为“0”或“1”等,这并不重要。
对于小n,我所做的是使用整数运算(n和x都是整数)计算x = 2 ^ n,然后
for(i=0;i<x;i++) {
bits = convert_integer_to_bits( i );
work_on_bits( bits );
}
这里'bits'在给定的位表示中,到目前为止有用的是一个长度为n的整数数组,其值为0或1(但可以是其他任何东西)。
如果n> 32,这种方法即使用long也显然不起作用。
我如何使用n&gt; 32?
具体来说,我是否真的需要评估2 ^ n,还是有一种棘手的写循环方式,它没有引用2 ^ n的实际值,但却迭代了2 ^ n次?
答案 0 :(得分:1)
对于n&gt; 32使用unsigned long long
。这将适用于高达64的n。对于甚至接近50的值,您还必须等待长时间,直到循环结束。
答案 1 :(得分:0)
目前尚不清楚为什么你说如果n> 32,它显然将不起作用。您关注的是位宽,还是关注运行时间?
如果您担心数字宽度,请调查一个大数学库,例如http://gmplib.org/。
如果你担心运行时间...如果宽度足够大,你的循环就不会足够长,所以得到一个不同的爱好;)认真地...弄清楚粗略的运行时间通过循环进行一次迭代并将其乘以40亿,除以20年,并且您将估计需要等待答案的祖先世代数。