C言語関係掲示板

過去ログ

No.916 フィボナッチ数の第n項を求めるプログラム(配列を必ず使用)

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

フィボナッチ数の第n項を求めるプログラム(配列を必ず使用)
投稿者---たける(2004/01/10 17:29:00)


一応つくって、コンパイルも出来たのですが何故か値は全然違う。
途方もない数値が出てしまい、全く分からなくなってしまいました。
プログラム自体はまだ、整えていないため汚いですどこが違っているのかをおしえていただけませんか?
ちなみに、MAX 100 はまだ適当に決めただけなのでご了承ください。

#include<stdio.h>
#include<stdlib.h>

#define MAX 100

unsigned long Fibo(int x);

main()
{
unsigned long f;
int n;
n=0;
f=0;

printf( "第何項目が知りたいですか?→" );
scanf("%d", &n);

if( n >= MAX ){
printf("数字が大き過ぎます\n");
exit(0);
}
f = Fibo(n);

printf( "%lu",f );

}

unsigned long Fibo(int x)
{
int i;
unsigned long fib[MAX],f;

fib[0] = 1;
fib[1] = 1;

for( i=0 ; i < x ; i++ ){
f = fib[i-1] + fib[i-2];
}

return(f);

}

No.11623

これを参考にしてみては
投稿者---le(2004/01/10 17:57:41)


#include <stdio.h>
#include <stdlib.h>
#define MAX 48
unsigned long result[MAX]; /* ここに計算結果を保存 */
/* n のフィボナッチ数を返す */
unsigned long Fibo3(int n)
{
int i;

result[1] = 1; /* n が 1 なら result[1] は 1 */
result[2] = 1; /* n が 2 なら result[2] は 1 */

/* n が 1 か 2 ならこのループは実行されない */
for (i = 3; i <= n; i++)/* 計算結果を蓄えながら計算を進める */
result[i] = result[i - 1] + result[i - 2];

return (result[n]);
}

void main(void)
{
int n; /* n のフィボナッチ数を求める */

printf("1から47迄の整数を入力して下さい\t");
scanf("%d", &n);

if(n > MAX) { /* n が 47より大きければ何もしないで終了 */
printf("数字が大き過ぎます\n");
exit(0);
}
/* フィボナッチ数を表示 */
printf("\nフィボナッチ 数は %lu\n", Fibo3(n));
}




No.11624

Re:フィボナッチ数の第n項を求めるプログラム(配列を必ず使用)
投稿者---たか(2004/01/10 18:00:29)


>プログラム自体はまだ、整えていないため汚いですどこが違っているのかをおしえていただけませんか?
>ちなみに、MAX 100 はまだ適当に決めただけなのでご了承ください。

fibo(2)以上を求められるように配列に代入していかなければなりません。

#include <stdio.h>
#include <stdlib.h>

#define MAX 100

unsigned long Fibo(int x);

int main(void)
{
  unsigned long f;
  int n;

  printf( "第何項目が知りたいですか?→" );
  scanf("%d", &n);

  if (--n >= MAX) { 
    printf("数字が大き過ぎます\n"); 
    exit(1);
  } 
  f = Fibo(n);
  printf( "%lu\n", f);
  
  return 0;
}

unsigned long Fibo(int x)
{
  int i;
  unsigned long fib[MAX], f;

  fib[0] = 1;
  fib[1] = 1;

  for (i = 2 ; i <= x; i++)
    fib[i] = fib[i - 1] + fib[i - 2];
  return fib[x];
}


No.11625

Re:フィボナッチ数の第n項を求めるプログラム(配列を必ず使用)
投稿者---たか(2004/01/10 18:03:32)


それとleさんのおっしゃられる通り、32ビットのulongではFibo(48)より
大きな数を求めようとするとオーバーフローしてしまいますね。

C99に対応しているコンパイラなら unsigned long longを使って
printf("%Lu") なんかを使えばいけるかも。

No.11626

Re:フィボナッチ数の第n項を求めるプログラム(配列を必ず使用)
投稿者---たか(2004/01/10 18:14:23)


>C99に対応しているコンパイラなら unsigned long longを使って
>printf("%Lu") なんかを使えばいけるかも。

C99だと printf("%llu") を使うようです。手持ちのコンパイラでは
どうもうまくいきません。

No.11627

ありがとうございますw
投稿者---たける(2004/01/10 18:43:36)


>>C99に対応しているコンパイラなら unsigned long longを使って
>>printf("%Lu") なんかを使えばいけるかも。
>
>C99だと printf("%llu") を使うようです。手持ちのコンパイラでは
>どうもうまくいきません。

わかりました♪そこはもう少し、コンパイラを考え詰め込んでいきます。
早い回答ありがとうございました。