予備知識:
階乗は、
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 () { puts("整数nを入力してください。"); while ( n >= i ) { |
実行例は次の通りです。
整数nを入力してください。 |
解説
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 訂正
はじめまして。
返信削除いつも参考にさせていただいています。
質問があるのですが、
33の階乗になんでマイナスが入るのですか?
コメントありがとうございます。
返信削除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になります。
誤りを正す事が出来ました。ありがとうございます!