2009年8月16日日曜日

第10回 while文②

予備知識:
階乗は、

n! = 1×2×3×・・・×n-1×n

と表せられる。ただし、0!=1です。

お題:
階乗を計算するプログラム
①はじめに、n!の整数nを入力させる
②n!の計算式と、計算結果を表示させる

プログラム実行例

整数nを入力してください。
n=5
5! = 1×2×3×4×5 = 120

必須事項
・while文を使うこと
・n=0にも対応する

解答は8月20日に掲載します。それまでにプログラムを作成し、
・プログラム文
・その実行ファイル
をメールに添付して以下のアドレスに送ってください。

解答、質問はこちらまで
cosmo-cleaner@za.pial.jp

---------------------------------------------------------------

解答例

1

2
3
4
5

6
7

8
9
10
11
12
13

#include <stdio.h>

int main () {
    int n,i,a;
    i=1;
    a=1;

   puts("整数nを入力してください。");
    printf("n=");    scanf("%d", &n);

    while ( n >= i ) {
        a=a*i;
        i++;
    }

    printf("%d!=%d\n",n,a);
}

実行例は次の通りです。

整数nを入力してください。
n=33
33!=-214748364
12!=479001600

解説

n=0の場合は1が答えですが、このプログラムではn=0の時while文を通らず、12行目のprintfにて、初期値のa=1が表示されます。

int型は10桁までしか保存できないので、n=33が限界です。n=34以上になると、n!が10桁を超えてしまいます。
int型は10桁までしか保存できないので、n=12が限界です。n=13以上になると、n!が10桁を超えてしまい、誤った値が出ます。

9行目の

a=a*i;

は、左辺のaが新しいaで、右辺のaは古いaです。while文のような繰り返す命令ではよくつかわれます。新しい変数にドンドン古い変数を入れていく感覚です。

答えられる範囲で質問いつでも受け付けます。
cosmo-cleaner@za.pial.jp

※2009.9.4 訂正

2 件のコメント:

  1. はじめまして。
    いつも参考にさせていただいています。

    質問があるのですが、
    33の階乗になんでマイナスが入るのですか?

    返信削除
  2. コメントありがとうございます。

    33の階乗にマイナスが入るのはint型aに10桁以上の数字が入ったためのエラーだと思われます。

    >int型は10桁までしか保存できないので、n=33が限界です。
    >n=34以上になると、n!が10桁を超えてしまいます。

    この記述は誤りです。すいませんん><
    正確にはn=12までが限界で、それ以上だとn!が10桁以上になりエラーになります。ちなみに、実行結果は以下のようになりました。
    12!=479001600 (9桁 正しい値)
    13!=1932053504 (10桁 エラーした値)
    14!=1278945280 (〃)
    15!=2004310016 (〃)
    17!=-288522240 (マイナスが出てくる)
    18!=-898433024 (〃)
    19!=109641728 (9桁)
    33!=-2147483648
    34!=0

    このように-の結果が出るようになります。34!以降はなぜか結果が0になります。
    誤りを正す事が出来ました。ありがとうございます!

    返信削除