2016-04-03 40 views
-6

当我运行这段代码时,为什么它给了我不正确的输出? 在我的系统中,我得到正确的输出。在图像的第一行是数字测试用例,然后是输入和输出。CodeChef小因子解决方案

#include <stdio.h> 
int main() 
{ 
    double fact; 
    int k,i,m,n; 
    scanf("%d", &n); 
    for (i=n; i>0; i--) 
    { 
     fact=1; 
     scanf("%d", &m); 
     for(k=2; k<=m; k++) 
      fact *= k; 
     printf("%.0lf\n", fact); 
    } 
    return 0; 
} 

实施例的输入和输出:

enter image description here

+0

请看看如何发布[mcve]和[我如何问一个好问题?](http://stackoverflow.com/help/how-to-ask)来帮助我们进一步提供帮助。你的示例输入在哪里可以证明问题? CodeChef的输出是什么,你的期望输出是什么? –

+1

您可以获得所示示例的正确答案。 'int'只能保存12个因子; 'long long'可以保持多达20的阶乘。你需要能够计算出高达100!的阶乘,它有157个数字。这是一个编码练习,你必须拿出你的小学课本上的乘法和手工乘数组数字。 (另外,也可以使用支持原生格式的语言,如Python。) –

回答

0

的问题,为M Oehm已经在评论中指出,是与正在使用的事实的数据类型。它太小而无法存储像100的数字,其中包含大约157个数字。您需要使用数组来存储数字。这是我对这个问题的解决方法(已被法官接受)。

#include<stdio.h> 

int main() 
{ 
    int t,j; 
    scanf("%d",&t); 
    while(t--) 
    { 
    int n; 
    scanf("%d",&n); 
    int a[1000] = {1}; 
    int m = 0; 
    int carry = 0; 
    for(int i=1; i<=n; i++) 
    { 
     for(j=0; j<=m; j++) 
     { 
     a[j] = (a[j]*i)+carry; 
     carry = a[j]/10; 
     a[j] = a[j]%10; 
     } 
     while(carry) 
     { 
     m++; 
     a[m] = carry%10; 
     carry/=10; 
     } 
    } 

    for(int i=m; i>=0; i--) 
     printf("%d",a[i]); 
    printf("\n"); 
    } 
    return 0; 
} 

编辑:我已经发布的原代码是用C++;但由于该问题已被标记为C,我已编辑上述代码C.

希望这有助于!