这是我前段时间分配的作业项目......我已经成功地完成了这项工作,我唯一的打嗝就是(我相信)数据类型和溢出问题。
我已经尝试过切换到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语句只在一行上发生?
答案 0 :(得分:2)
对于垃圾,您很可能遇到整数溢出,也就是说,您的计算值对于long
数据类型来说太大了。你应该通过计算你的阶乘函数来纠正它,而不是明确地计算n!。
答案 1 :(得分:2)
您正遭受整数溢出。您可能需要找到一种不同的算法,以避免计算大数。
在回答有关换行符的另一点时,您将在print语句中使用\n
明确打印换行符。删除它,你会得到一行打印的答案。您可能希望在结尾处输入最后的printf("\n");
,以便整行以换行符终止。
其他一些观察结果:
return 0;
- 控件将退出
if
块的底部和第二个(仅应该)
return 0;
并且不会造成任何问题。scanf
;你可以直接通过&n
。答案 2 :(得分:1)
将scanf(" %i", nPtr);
更改为
scanf(" %ld", nPtr);
和printf("\n %i", ans);
到
printf("\n %ld", ans);
要在一行上打印输出,请使用:
printf(" %ld", ans);
如果您使用gcc
,请启用警告,即使用-Wall
。