C 0-1个序列,不重复1';s
我的任务是编写一个程序,其中输入是2的指数,输出是序列数(在最大的2^n序列中),其中没有相邻的1。(n对于变量C 0-1个序列,不重复1';s,c,C,我的任务是编写一个程序,其中输入是2的指数,输出是序列数(在最大的2^n序列中),其中没有相邻的1。(n对于变量ki: 步骤1:使用unsigned long-long而不是int 第二步:使用12^32-1是int的最大值。你有pow(2,32)。使用int64而不是int,否则如果int只有32位,那么你会溢出。在C中,(1)我不知道这个公式是否真的能给出正确的数字……对于n==4,ki是16-6=10,但我只能得出8个有效的排列:(0)0000(1)0001(2)0010(3)0100(4
ki
:
步骤1:使用unsigned long-long
而不是int
第二步:使用
12^32-1是int的最大值。你有pow(2,32)。使用int64而不是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。
#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;
}
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;
}