CodeChef小因子解决方案

时间:2016-04-03 14:57:01

标签: c

当我运行此代码时,为什么它会给我错误的输出? 在我的系统中,我得到了正确的输出。在图像中,第一行是数字测试用例,后跟输入和输出。

#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

2 个答案:

答案 0 :(得分: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代码。

希望这有帮助!

答案 1 :(得分:0)

问题是您使用 double 来存储将是远程的阶乘输出。只需将输出转换为 BigInteger.for this first cast to string 然后 to bigint 。

/* package codechef; // don't place package name! */
    
    import java.util.*;
    import java.lang.*;
    import java.io.*;
    import java.math.BigInteger;
    
    /* Name of the class has to be "Main" only if the class is public. */
    class Main
    {
        public static void main(String args[]) {
            Scanner sc=new Scanner(System.in);
            int t=sc.nextInt();
            if(t>=1 && t<=100) {
                while(t>=1) {
                    int n=sc.nextInt();
                    if(n>=1 && n<=100) {
                    BigInteger f=BigInteger.ONE;
                    while(n>1) {
                        f=f.multiply((new BigInteger (String.valueOf(n))));
                        n--;
                    }
                    System.out.println(f);
                    }
                    t--;
                
                }
            }
            sc.close();
        }   
    }
    //this code is accepted