【问题标题】:0-1 sequences without repeating 1's0-1 序列不重复 1
【发布时间】: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


【解决方案1】:

对于变量ki:

第 1 步:使用 unsigned long long 而不是 int。

第 2 步:使用 1&lt;&lt;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;
}

【讨论】:

    猜你喜欢
    • 2015-08-03
    • 2019-09-18
    • 1970-01-01
    • 2017-11-28
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    相关资源
    最近更新 更多