1

这是我前段时间分配的一个家庭作业项目......我已经成功地独自完成了这一步,而我剩下的唯一问题是(我相信)数据类型和溢出问题。

我尝试切换到无符号和双精度,并且代码符合并仍然接受终端中的输入,但之后似乎挂断了......没有打印任何内容,看起来它陷入了循环。

这是代码...

    /* 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

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

4

3 回答 3

2

long对于垃圾,您很可能会遇到整数溢出,即您的计算值对于数据类型而言变得太大。您应该通过计算阶乘函数来纠正它,而无需明确计算 n!。

于 2011-09-30T08:39:31.220 回答
2

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

在回答您关于换行符的另一点时,您\n在 print 语句中明确打印换行符。删除它,您将得到打印在一行上的答案。您可能希望在末尾添加一个决赛printf("\n");,以便整行以换行符终止。

其他一些观察:

  • 您不需要第一个return 0;- 控件将从块的底部掉到if第二个(应该是唯一的) return 0;并且不会引起任何问题。
  • 您正在声明 kPtr 但未在任何地方使用它
  • 您无需声明单独的变量 nPtr 即可传递给scanf; 可以&n直接通过。
于 2011-09-30T08:43:34.200 回答
1

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

scanf(" %ld", nPtr); 

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

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

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

printf(" %ld", ans);

如果您正在使用gcc,请打开警告,即使用-Wall.

于 2011-09-30T08:46:33.307 回答