我的任务是编写一个程序,其中输入是指数2,输出是序列的数量(在最大2 ^ n个序列中),其中彼此没有1。 (N< = 50)
例如,在3的输入上,输出为5,因为2 ^ 3 = 8,在8种可能性中,唯一可接受的是:(000,001,010,100,101)和(110,011,111)是不可接受的,因为彼此相邻的是2个或更多。
我的程序工作正常,直到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。
答案 0 :(得分:1)
对于变量ki
:
第1步:使用unsigned long long
代替int
。
第2步:使用1<<n
代替pow(2,n)
。
第3步:使用llu%
代替%d
。
int main()
{
int t,i,n;
unsigned long long ki,one=1;
scanf("%d",&t);
for (i=1;i<=t;i++)
{
scanf("%d",&n);
ki = (one<<n)-n*(n-1)/2;
printf("Scenario #%d:\n%llu\n\n",i,ki);
}
return 0;
}