相同输入的 ideone 和代码块中的不同输出(小阶乘)
Posted
技术标签:
【中文标题】相同输入的 ideone 和代码块中的不同输出(小阶乘)【英文标题】:Different output in ideone and codeblocks for same input(small factorials) 【发布时间】:2016-11-24 07:24:30 【问题描述】:以下代码计算输入整数的阶乘。我在 Codeblocks 中运行了 2 个测试用例 - 9 和 2 并得到了正确的输出。对于相同的输入,ideone 将 2 的阶乘输出为 6,但它正确输出 9 阶乘。出了什么问题?此外,当我将 b 设为大小为 200 的静态数组而不是动态数组时,ideone 会给出正确的输出。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
int t,i,j,k,temp,carry=0,len=0;
scanf("%d",&t);
int *b=new int;
int *a=new int[t];
for (i=0;i<t;i++)
scanf("%d",&a[i]);
for (i=0;i<t;i++)
len=0;
b[0]=1;
for (j=1;j<=a[i];j++)
carry=0;
for (k=0;k<=len;k++)
temp=b[k]*j+carry;
b[k]=temp%10;
carry=temp/10;
while (carry!=0)
b[++len]=carry%10;
carry/=10;
for (j=len;j>=0;j--)
printf("%d",b[j]);
printf("\n");
return 0;
【问题讨论】:
int *b=new int;
-- 你为什么在这里使用指针?为什么不直接声明int
?
另外,我不明白您在程序中输入了什么。您说您输入了9
和2
,但您的程序显示scanf
在循环中被调用。为什么不直接将数据硬编码到程序中,以免让人感到困惑?
【参考方案1】:
int *b=new int;
只为b
分配一个对象。之后只有b[0]
或*b
有效。 b[k]
对 k
的值无效,0
除外。因此,您的程序具有未定义的行为。
如果大小为 200 的静态数组有效,那么
int *b=new int[200];
应该可以。
如果在编译时知道数组的大小,我会建议使用数组而不是使用动态分配的内存。喜欢
int b[200];
结束
int *b=new int[200];
【讨论】:
谢谢,我现在知道了。但是,静态数组比动态数组更受欢迎有什么特别的原因吗? @NikhilKaushik,如果可以的话,使用静态数组有几个原因。动态数组需要更多代码来管理分配和解除分配。使用动态分配的内存更昂贵 - 运行时必须做簿记工作。以上是关于相同输入的 ideone 和代码块中的不同输出(小阶乘)的主要内容,如果未能解决你的问题,请参考以下文章