【发布时间】:2014-03-06 23:23:30
【问题描述】:
我的任务是编写一个程序,其中输入是 2 的指数,输出是序列的数量(在最大 2^n 序列中),其中没有相邻的 1。 (n
例如,输入 3,输出为 5,因为 2^3=8,在 8 种可能性中,唯一可接受的可能性是:(000, 001, 010, 100, 101) 和 (110,011,111)不可接受,因为有 2 个或多个 1 彼此相邻。
我的程序在 31 之前工作正常,在 32 号停止工作时,我猜是溢出问题。我尝试了 long int 和 unsigned int,这些似乎都没有帮助。
#include <stdio.h>
#include <math.h>
main(){
int t,i,n,j,ki;
scanf("%d",&t);
for (i=1;i<=t;i++){
scanf("%d",&n);
ki=pow(2,n)-(n*(n-1))/2;
printf("Scenario #%d:\n%d\n\n",i,ki);
}
return 0;
}
帮我pl0x。
【问题讨论】:
-
2^32 - 1 是 int 的最大值。你有 pow(2,32)。
-
使用 int64_t 代替 int,否则如果 int 只有 32 位就会溢出。
-
在 C 中,(1
-
我想知道这个公式是否真的可以给出正确的数字...对于
n == 4,ki是16 - 6 = 10,但我只能想出 8 个有效排列:( 0)0000(1)0001(2)0010(3)0100(4)1000(5)0101(6)1001(7)1010(8) -
是的,你可能是对的。使用 long long int 和 %lld 解决了溢出问题,但现在你让我意识到我的公式也很糟糕:D。
标签: c