ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

C言語とC++言語コミュのC言語でフィボナッチ数列のプログラムを作りたい。

  • mixiチェック
  • このエントリーをはてなブックマークに追加
求めたい項数nを実行時にキーボードから入力するとフィボナッチ数列の第n項目が出力される。

1〜50以外の数を入力するとプログラムが終了しそれまでは繰り返し上記の処理を行う。

というプログラムを作っていて下記のようなプログラムを作ってコンパイルしてエラーは出ずフィボナッチ

数列のn項目の数字が求まるのですが、なぜかn=47の時にマイナスの値が求まってしまいそれより後

の項目の数字がおかしくなってしまいます。

どこが間違いなのでしょうか?

ご指摘お願いします。


#include <stdio.h>

int main(void)
{
unsigned int fib[50];
int n;
int i;

fib[1] = 1;
fib[2] = 1;

printf("終了するときは1〜50以外の数を入力して下さい。\n\n第何項目の数を求めますか?==>");

for(n=3 ; n<50 ;n++){
fib[n]=fib[n-1]+fib[n-2];
}

for(;;){
scanf("%d",&n);

if(n >= 1 && n <= 50){
printf("fib[%d]=%d\n第何項目の数を求めますか?==>",n,fib[n]);
}
else{
printf("プログラムを終了します。\n");
break;
}
}
return 0;
}

コメント(23)

処理系が書かれてないけど
unsigned intを%dでprintfしてるからだと思いますよ。
あと、n==50 のときが間違ってるようですね

もしOSが32ビットなら、フィボナッチの50は32ビットを超えます。
47項からはsigned intが取りうる最大値を超えるので、マイナスになります。
これが、大学か何かの課題で、stdio.hだけを使えというなら、自分でbignumを実装する必要があるでしょう。
単に勉強であるなら、int64_tをつかって、出力時にlldを使えばOKです。

がんばってください。
> 2
確かintのビット長は、OSが何ビットかに依らなかったはず。
実際、うちの64ビットマシンだとsizeof(int)は4です。
n=50まででいいなら、double を使って %.0f で表示するという手もありますね。
> 千鶴さん
知らなかった。longだけなんですね、影響があるのは。
> 6
整数型は処理系依存だったはずなんで、影響はあります。
細かいことは規格書が手元にないのであれですが・・。

個人的には、stdint.hで定義されてる固定幅の整数型使えばいいじゃないかって思いますが。
処理系というのはコンパイラのことでOSの事ではないです。一応、「CPUにとって自然な長さの整数」がintってことになってますが。
64bitOSに載ってるCコンパイラはおそらくはそのOSのカーネルをコンパイルできるはずなので、int=long=32bitってことは考えにくいけど、C言語規格として許されない訳じゃなかったはず。
最近このネタで大混乱したひでのふがきましたよw
自分も
int = 「CPUにとって自然な長さの整数」
で、覚えていたクチでしたが、実際はそうではなく

http://ja.wikipedia.org/wiki/整数型

に載っているとおり、64bitOSでも

int = 32bit
long = 64bit

と、なっています。
なってないって。
そーゆー実装の事例が多いってのと「C言語ってのはそういうもの」ってのは分けて議論しましょうや。

「CPUにとって自然な長さ」ってのはK&R時代だけで、ANSIで変えられたっけ?どっちにしてもinformalな説明の言葉に過ぎないけど。
> なってないって。
自分の発言は誤りで、saitoh殿の「そーゆー実装の事例が多い」が正しいです。

#ILP64の存在をすっかり忘れてたw

そうですね。配列に値を入れるfor文は <50 で回してますが、ユーザ入力値のチェックは <=50でチェックしてるのでfin[50]を参照してしまいますね。 
> 13, 14

それ、1 で既に指摘されてると思うんですけど ^^;
>>2〜14の回答をしてくれた皆様ありがとうございました。
返事が遅れてしまい申し訳ございません。
結局、n=50まで求めたかったのでdouble を使って %.0fで問題は解決しました。
また新たに質問をしたいと思いますのでよろしければアドバイスをください。
ILP64でもLP64でも64bit整数がほしけりゃint64_tを使えばいい。
intの大きさは考慮すべからず。
int64_tっていつのC規格から入りましたっけ?
C99の時代で既にそれらしきことが書かれてるね。
MUST扱いしてないけど、ILP64もしくはLP64処理系でC99前提になっているものなら
定義されているとみなせるだろう。
わたしのメインのターゲットプラットフォームはLLP64なので、是非LP64な方(Unix系の方?)に質問なのですが、


LP64ではlong=longlongになってしまいましたが、このまま成長を続けると(?)LP128では、long>longlongというかなり謎いことになっちゃいそうな気がするのですが、longはどのようになると予測しているのですか?

ちなみにわたしが好きなデータモデルは
SHORT(16) LONG(32) LONGLONG(64) INT(64) PTR(64)
なのですが、こんなデータモデルは見たことがありません。なぜ??

ログインすると、残り4件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

C言語とC++言語 更新情報

C言語とC++言語のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング