第3講 繰り返し処理for文
第3話 階乗の計算
1×2×・・・×8の解答例
#include<stdio.h> //C言語プログラミングをはじめるためのお呪い。
int main() {
int a,i; //整数を入れる箱aを用意
a = 1;
//繰り返し処理
for(i=1;i<9;i++){
a=a*i;
}
printf("1×2×・・・×8=%d\n", a); //箱aの中身を表示
return(0); //mainを閉じるためのお呪い。
}
実行結果
1×2×・・・×8=40320
これをみて1×2×・・・×20等を計算させた方もいらっしゃるではないでしょうか。
ところが実行結果は、
1×2×・・・×20=-2102132736
と奇妙なものです。
これはint型の扱える範囲-2,147,483,648 〜 2,147,483,6472,147,483,648
をオーバーしてしまったためです。
そこで、
#include<stdio.h> //C言語プログラミングをはじめるためのお呪い。
int main() {
long long a,i; //整数を入れる箱aを用意
a = 1;
//繰り返し処理
for(i=1;i<21;i++){
a=a*i;
}
printf("1×2×・・・×20=%d\n", a); //箱aの中身を表示
return(0); //mainを閉じるためのお呪い。
}
と変更しても、実行結果は
1×2×・・・×20=-2102132736
と変な表示となります。
long longはC++が用意する最大の整数でその最大値は
9,223,372,036,854,775,807
ですから充分範囲に収まっています。
なのに変な値になるのはprintf()の表示桁数を超えているためだと思われます。
実際に、コードをC++のコードの変更すると、
#include<iostream> //入出力のために組み込む
using namespace std; //coutを使えるようにするために必要
int main() {
long long a,i; //整数を入れる箱aを用意
a = 1;
//繰り返し処理
for(i=1;i<21;i++){
a=a*i;
}
cout<<"1×2×・・・×20="<<a<<endl; //箱aの中身を表示
return(0); //mainを閉じるためのお呪い。
}
実行結果
1×2×・・・×20=2432902008176640000
と正しく計算できます。
ですが、これが限界です。
限界桁数の19桁に達してしまっているからです。
後の講の1つに巨大完全数探索があり、
そこでは1937桁の完全数探索をやります。
C言語の拡大版であるC++の機能を使っても19桁が限界ですから、
これがいかに難しいテーマであるかおわかりでしょう。
ですが、この講義を順に読んでいけば、初心者の皆さんでも充分に組めますよ。
では次の問題を出して第3話を終了します。
@1の2乗+2の2乗+3の2乗+・・・+100の2乗
A5の3乗+7の3乗+9の3乗+・・・+31の3乗