C 0-1个序列,不重复1';s

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

我的任务是编写一个程序,其中输入是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)
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;
}