C言語関係掲示板

過去ログ

No626 フィボナッチ数列

[戻る] [ホームページ]
No.6399

フィボナッチ数列
投稿者---tin(2003/05/15 17:05:42)


はじめまして。
このプログラムはフィボナッチ数列を可能な限り表示していくものですが、途中の46番目くらいでその値が不の数になってしまうのはどうしてなんでしょうか?

#include<stdio.h>
int main(void){
int a=0,b=1,c=2;
int i;
for(i=1;i<100;i++){
c=a+b;
printf("%5d %d\n",i,c);
a=b;
b=c;
}
return(0);
}


No.6401

Re:フィボナッチ数列
投稿者---こん!(2003/05/15 17:39:18)


>このプログラムはフィボナッチ数列を可能な限り表示していくものですが、


これ試したら。

#include<stdio.h>
int main(void){
    int a=0,b=1,c=2;
    int i;
    for(i=1;i<100;i++){
        c=a+b; 
        printf("%5d %x %d\n",i,c,c);
        a=b;
        b=c;
    }
    return(0);
}

ただの桁あふれのような気がするけど?
しかしタイムリーなネタだな・・・

No.6402

Re:フィボナッチ数列
投稿者---こん!(2003/05/15 17:47:40)


#include<stdio.h>
int main(void){
    int a=0,b=1,c=2;
・・・
}

>しかしタイムリーなネタだな・・・

しかしあちらの解答例を見ると初期値が違うような気がするな。
    int a=1,b=1,c;
こうか?

No.6429

Re:フィボナッチ数列
投稿者---tin(2003/05/16 02:11:06)


だいぶタイムリーでしたね、流行なのかも。
申し訳ないっす、初期値間違えてました。
ところであのprintf関数のなかの%xは何を表示させているんですか?


No.6430

Re:フィボナッチ数列
投稿者---しんちー(2003/05/16 03:48:54)


>ところであのprintf関数のなかの%xは何を表示させているんですか?

実行結果は全然見ないで申しますが、
%x は16進表示を見ようってことですね。
(普通のPCではintは32ビットですから、)
16進で80000000以上は負の数とみなされます。
なので、そういうことを気にしたくないのであれば、
a, b, c を unsigned int で宣言すれば、ちょっとは乗り切れると思います。


No.6432

Re:フィボナッチ数列
投稿者---かずま(2003/05/16 09:59:34)


> a, b, c を unsigned int で宣言すれば、ちょっとは乗り切れると思います。

ちょっとと言っても、1つだけですね。
double にすると、80個まで OK です。
#include <stdio.h>

int main(void)
{
    double a = 0, b = 1, c;
    int i;

    for (i = 1; i < 100; i++) {
        c = a + b; 
        printf("%5d %24.0f  %.16e\n", i, c, c);
        a = b;
        b = c;
    }
    return 0;
}


No.6434

Re:フィボナッチ数列
投稿者---かずま(2003/05/16 10:06:25)


> double にすると、80個まで OK です。

gcc で、unsigned long long だと、92個まで OK です。
#include <stdio.h>

int main(void)
{
    unsigned long long a = 0, b = 1, c;
    int i;

    for (i = 1; i < 100; i++) {
        c = a + b; 
        printf("%5d  %016qx  %24qu\n", i, c, c);
        a = b;
        b = c;
    }
    return 0;
}


No.6435

Re:フィボナッチ数列
投稿者---かずま(2003/05/16 10:17:19)


>       printf("%5d  %016qx  %24qu\n", i, c, c);
C99 の規格だと、q ではなく、ll のようです。
       printf("%5d  %016llx  %24llu\n", i, c, c);


No.6437

Re:フィボナッチ数列
投稿者---かずま(2003/05/16 10:30:50)


long を 3つ使ってみました。これで、100でも大丈夫。
#include <stdio.h>
#include <string.h>

int add(long *c, const long *a, const long *b)
{
    int i, carry = 0;

    for (i = 0; i < 3; i++) {
        c[i] = a[i] + b[i] + carry;
        carry = (c[i] > 99999999);
        if (carry) c[i] -= 100000000;
    }
    return carry;
}

int main(void)
{
    long a[3] = { 0 }, b[3] = { 1 }, c[3];
    int i;

    for (i = 1; i <= 100; i++) {
        add(c, a, b); 
        printf("%5d %8ld%08ld%08ld\n", i, c[2], c[1], c[0]);
        memcpy(a, b, sizeof a);
        memcpy(b, c, sizeof b);
    }
    return 0;
}


No.6436

Re:フィボナッチ数列
投稿者---こん!(2003/05/16 10:21:19)


>a, b, c を unsigned int で宣言すれば、ちょっとは乗り切れると思います。

後はたまに話題にのぼるこれですかね。

No.6431

Re:フィボナッチ数列
投稿者---こん!(2003/05/16 09:18:11)


しんちーさんに補足という事で、こちらを読んで変数というものの扱いをよく理解
されたほうがよろしいかと。
単にintとして変数を確保したからといって整数の値が何桁まででも入るわけでは
ありません。確保される領域は処理系に依存されますが概念としては先のリンク
で分かるかと思います。

>ところであのprintf関数のなかの%xは何を表示させているんですか?

後こういった標準函数の使い方なんかはいくらでもマニュアルは在るのですしそ
れでなくてもこちらを見れば大体は分かるはずです。まずは自分で調べるくせを
付けましょう。

こん!<=^・^=>

No.6482

Re:フィボナッチ数列
投稿者---tin(2003/05/16 23:26:43)


みなさん丁寧にありがとうございます。ってことは理由はあの位置がintで表せる限界だからってことですね。