Pascal的三角形返回无意义的值

时间:2011-09-30 08:32:55

标签: c pascals-triangle

这是我前段时间分配的作业项目......我已经成功地完成了这项工作,我唯一的打嗝就是(我相信)数据类型和溢出问题。

我已经尝试过切换到unsigned和double,并且代码符合并仍然接受终端中的输入,但它似乎在此之后挂起......没有打印任何内容,它看起来像是在循环中捕获。

这是代码......

    /* pascaltri.c
     * A program that takes a single integer as input and returns the nth line of
     * Pascal's Triangle. Uses factorial() function to help find items of
     * individual entries on a given row.
     */
    #include <stdio.h>
    #include <stdlib.h>
    long factorial(long i) 
    {
        long fact = 1;

        while(i > 1)
        {
            fact = fact * i;
            i = i - 1;
        }
        return fact;
    }
    main(void)
    {   
        long n;
        long *nPtr;
        nPtr = &n;
        scanf(" %i", nPtr); 
        if (n >= 0)
        {
            long k;
            long *kPtr;
            kPtr = &k;                
            for(k = 0; k <= n; k++)
            {
                long ans;
                long *ansPtr;
                ansPtr = &ans;

                ans = factorial(n) / (factorial(k) * factorial(n - k));
                printf("\n %i", ans);
            }
            return 0;
        }
        return 0;
    }

它不完美或漂亮,但它可以达到三角形的13(即第14行)的输入。除此之外,我开始得到胡言乱语,甚至负值都洒在整个回报中......更大的值会破坏代码,只返回退出错误消息。

有关如何纠正此问题的任何想法?我一直盯着屏幕不久就能看到任何东西。此外,它不是必需的,但我想在一行上打印我的返回值,而不是用换行符分隔它们。

1 5 10 10 5 1

最简单的方法是在计算数据时将值加载到数组中,然后打印数组吗?或者是否有内置的方法我可以告诉print语句只在一行上发生?

3 个答案:

答案 0 :(得分:2)

对于垃圾,您很可能遇到整数溢出,也就是说,您的计算值对于long数据类型来说太大了。你应该通过计算你的阶乘函数来纠正它,而不是明确地计算n!。

答案 1 :(得分:2)

您正遭受整数溢出。您可能需要找到一种不同的算法,以避免计算大数。

在回答有关换行符的另一点时,您将在print语句中使用\n明确打印换行符。删除它,你会得到一行打印的答案。您可能希望在结尾处输入最后的printf("\n");,以便整行以换行符终止。

其他一些观察结果:

  • 您不需要第一个return 0; - 控件将退出 if块的底部和第二个(仅应该) return 0;并且不会造成任何问题。
  • 您宣布kPtr但未在任何地方使用
  • 您无需声明单独的变量nPtr传递给scanf;你可以直接通过&n

答案 2 :(得分:1)

scanf(" %i", nPtr);更改为

scanf(" %ld", nPtr); 

printf("\n %i", ans);

printf("\n %ld", ans);

要在一行上打印输出,请使用:

printf(" %ld", ans);

如果您使用gcc,请启用警告,即使用-Wall