相同输入的 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 另外,我不明白您在程序中输入了什么。您说您输入了92,但您的程序显示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 和代码块中的不同输出(小阶乘)的主要内容,如果未能解决你的问题,请参考以下文章

相同的输入和指令,但不同的延迟,如何?

火花不同的输入/输出目录大小(对于相同的数据)

切蛋糕

XAML:相同的模板,不同的绑定

AcWing 846. 树的重心

代码在 ideone 中编译,但不使用 gcc