2016-04-03 10 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; 
} 

例入力と出力:M Oehmはコメントで指摘したように

enter image description here

+0

[mcve]と[よくある質問を投稿するにはどうすればいいですか](http://stackoverflow.com/help/how-to-ask)をご覧ください。問題を示す入力例はどこですか? CodeChefの出力は何ですか?また、期待される出力は? –

+1

ここに示した例について正しい答えが得られます。 'int'は階乗だけを12まで保持できます。 「long long」は階乗を20まで保持できます。階乗を100まで計算することができる必要があります。これは157桁です。これはコーディングの練習です。あなたは、乗算に関する学年の教科書を手にして、数字の配列を手で掛けなければなりません。 (あるいは、Pythonなどのネイティブにbignumsをサポートする言語を使用してください)。 –

答えて

0

問題、あなたが実際に使用しているデータ型です。約157桁の100などの階乗を格納するには小さすぎます。配列を使用して数字を格納する必要があります。ここに問題への私のアプローチがある(それは裁判官によって受け入れられている)。

#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でタグ付けされているので、上記のコードを編集しました。

関連する問題