C言語で以下のプログラミングを作成してください 全くわからないのでお願いします

C言語関連128閲覧

ベストアンサー

0

ThanksImg質問者からのお礼コメント

ありがとうございます

お礼日時:7/4 2:33

その他の回答(2件)

0

配列1つに4桁まで格納してみました。 とりあえず1000要素=4000桁に設定してあるので、1463の階乗まで計算できます。 #define MAX 1000 #include <stdio.h> int product(int n); int main(void) { int n; for (n = 1; n <= 20; n++) { if (product(n)) { return 1; } } return 0; } int product(int n) { unsigned int t[MAX] = { 1 }; unsigned long int nL, nc; int i, imax = 0; printf("%d! = ", n); do { nc = 0; for (i = 0; i <= imax; i++) { nL = t[i] * n + nc; nc = nL / 10000; t[i] = nL % 10000; if (nc != 0) { if (i >= MAX) { printf("OVERFLOW\n"); return 1; } } } if (nc != 0) { t[i] = nc; imax = i; } } while (--n >= 1); printf("%d", t[imax]); for (i = imax - 1; i >= 0; i--) { printf("%04d", t[i]); } printf("\n"); return 0; }

0

次のようなプログラムでいかがでしょうか。 計算結果を配列に入れていますので数値が大きくなっても対応できます。DIGIT 100 では入力値 69 まで、DIGIT を変更すればもっと大きな入力値でも計算できます。桁溢れ等のエラー処理は省いています。 -- #include <stdio.h> #include <stdlib.h> #include <stdbool.h> // 有効桁数 #define DIGIT 100 void product(const int n, int* result, const int digit) {     // 一時計算用配列とその初期化     int tmp[digit + 1];     for(int i = 0; i < digit + 1; i++) {         tmp[i] = 0;     }     // 計算     for(int i = 1; n >= i; i++) {         if(i == 1) {             result[0] = 1;         } else {             for(int j = 0; j < digit; j++) {                 tmp[j] += result[j] * i;                 tmp[j + 1] += tmp[j] / 10; // 繰り上がり                 tmp[j] %= 10;                 // 桁溢れのエラー処理は省略                 // tmp[digit] に格納された値は無視             }             // 計算結果を result に格納し tmp を初期化             for(int j = 0; j < digit; j++) {                 result[j] = tmp[j];                 tmp[j] = 0;             }         }     } } int main(void) {     int n; // 入力値     int result[DIGIT] = { 0 }; // 計算結果格納用配列     puts("自然数 n を入力してください。");     scanf("%d", &n);     product(n, result, DIGIT);     printf("計算結果:");     bool disp = false;     for(int i = DIGIT - 1; i >= 0; i--)         // 最初に 1 以上が出るまで表示しない         if(disp || (disp = result[i] > 0))             printf("%d", result[i]);     if(!disp)         printf("0");     return EXIT_SUCCESS; }

上記のプログラムのように有効数字を任意で増やすことはできませんが、double を使って簡単に書くこともできます。 -- #include <stdio.h> #include <stdlib.h> double product(const int n) {     double r = 1.0;     for(int i = 1; i <= n; i++) {         r *= i;     }     return r; } int main(void){     int n;     puts("自然数 n (n > 1) を入力してください。");     scanf("%d", &n);     printf("計算結果:%.0f", product(n));     return EXIT_SUCCESS; }