当前位置:  开发笔记 > 编程语言 > 正文

当试图打印帕斯卡三角形时,第13次迭代打印错误的答案

如何解决《当试图打印帕斯卡三角形时,第13次迭代打印错误的答案》经验,为你挑选了1个好方法。

我在C中编写一个脚本来打印出pascals三角形,所以我为factorial编写了一个函数,然后将变量c =变为二项式展开式,这直到第n行,它产生输出:

1 
1 1 
1 2 1 
1 3 3 1 
1 4 6 4 1 
1 5 10 10 5 1 
1 6 15 20 15 6 1 
1 7 21 35 35 21 7 1 
1 8 28 56 70 56 28 8 1 
1 9 36 84 126 126 84 36 9 1 
1 10 45 120 210 252 210 120 45 10 1 
1 11 55 165 330 462 462 330 165 55 11 1 
1 12 66 220 495 792 924 792 495 220 66 12 1 
0 4 24 88 221 399 532 532 399 221 88 24 4 0

最后一行是n = 13.我原本认为它是破坏的,因为对于32位整数,因子会很大但是64位整数仍然存在错误...

#include 
#include 
#include 
#include 


int64_t factorial(int k);

int main(int argc, char **argv)
{
    int c, n, r, i;

    if (argc < 2) {
        printf("[function]:  %s [number of lines to print]", argv[0]);
        return -1;
    }

    n = atoi(argv[1]);

    for (i = 0; i <= n; i++) {
        for (r = 0; r <= i; r++) {
            c = (int) factorial(i) / (factorial(r) * factorial((i - r)));
            printf("%d ", c);
        }
        printf("\n");
    }
    return 1;


}

int64_t factorial(int k)
{
    int64_t j;

    if (k == 0 || k == 1)
        return 1;

    int n = k;

    for (j = k; n > 1;)
        j = j * --n;
    return j;
}

我非常感谢对此有所帮助......



1> chqrlie..:

你的计算甚至在64位时都失败了,因为你用脚趾射击自己的脚(它很痛):

c = (int) factorial(i) / (factorial(r) * factorial((i - r)));

被解析为

c = ((int)factorial(i)) / (factorial(r) * factorial((i - r)));

只需删除演员表或将其放在结果上:

c = (int)(factorial(i) / (factorial(r) * factorial(i - r)));

请注意,您的factorial功能太复杂了,这是一个更简单的版本:

int64_t factorial(int n) {
    int64_t x;
    for (x = 1; n > 1; n--) {
        x *= n;
    }
    return x;
}

另请注意,您不需要计算全因子,此版本为29,并且可以通过一些工作进一步改进:

#include 
#include 

long long binomial(int n, int p) {
    int q;
    long long x;

    if (p < n - p)
        p = n - p;
    q = n - p;
    for (x = 1; n > p; n--)
        x *= n;
    for (; q > 1; q--)
        x /= q;
    return x;
}

int main(int argc, char **argv)
{
    int n, r, i;

    if (argc < 2) {
        printf("[function]:  %s [number of lines to print]", argv[0]);
        return -1;
    }

    n = atoi(argv[1]);

    for (i = 0; i <= n; i++) {
        for (r = 0; r <= i; r++) {
            printf("%lld ", binomial(i, r));
        }
        printf("\n");
    }
    return 0;
}

最后,如果允许使用数组,则可以进一步简化Pascal三角形的计算,因为每个系数是它上面的那个和该那个的左边一个的总和:

#include 
#include 

int main(int argc, char **argv) {
    int n, r, i;

    if (argc < 2) {
        printf("[function]:  %s [number of lines to print]", argv[0]);
        return -1;
    }

    n = atoi(argv[1]);
    long long coeff[n + 1];

    coeff[0] = 1;
    for (r = 1; r <= n; r++) {
        coeff[r] = 0;
    }
    for (i = 0; i <= n; i++) {
        for (r = i; r > 0; r--) {
            coeff[r] += coeff[r - 1];
        }
        for (r = 0; r <= i; r++) {
            printf("%lld ", coeff[r]);
        }
        printf("\n");
    }
    return 0;
}

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有