【问题标题】:Pascal's Triangle returning nonsense values帕斯卡三角返回无意义值
【发布时间】:2011-11-28 07:14:03
【问题描述】:

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

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

这里是代码...

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

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

【问题讨论】:

  • factorial(n) 可以很大,但是 factorial(k)factorial(n-k) 也可以。帕斯卡三角形的秘密在于,您无需计算阶乘即可逃脱,请在此处查看我的答案:stackoverflow.com/questions/16709748

标签: c pascals-triangle


【解决方案1】:

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

在回答您关于换行符的另一点时,您在打印语句中使用\n 显式打印换行符。删除它,您将得到打印在一行上的答案。您可能希望在末尾添加一个最终的 printf("\n");,以便整行以换行符结束。

其他一些观察:

  • 您不需要第一个return 0; - 控件将退出 if 块的底部和第二个(应该是唯一的) return 0; 不会造成任何问题。
  • 您声明了 kPtr,但没有在任何地方使用它
  • 您无需声明单独的变量 nPtr 即可传递给scanf;可以直接传&amp;n

【讨论】:

  • 很高兴知道我的想法至少在正确的轨道上,这是一个溢出问题。其他技巧也有助于消除几行无关代码。指针学习起来很痛苦,但它们肯定很有用!
【解决方案2】:

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

【讨论】:

  • 当你说'没有显式计算n'时,你指的是代码开头的阶乘函数吗?还是在计算和打印答案的地方使用该功能?只是想澄清一下......
  • @WCStride: 如果你想计算 binom(10, 7),你不应该做10!/(7!*3!),而是10 * 9 * 8 / (1 * 2 * 3)。这样,数字就不会那么快变得太大,您可以稍微推动一下限制。我认为这就是 thiton 所指的。
【解决方案3】:

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

scanf(" %ld", nPtr); 

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

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

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

printf(" %ld", ans);

如果您使用的是gcc,请打开警告,即使用-Wall

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2012-07-13
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多