• ベストアンサー

C言語のプログラミングについてですが・・・

初期値a を9 とし、a←3*a+4 で更新されるaを50 回分順に出力するプログラムをfor 文を利用して作成して下さい。 (漸化式a(i+1)=3*a(i)+4、初期値a(0)=9 で表される数列のa(0)~a(49)の値を順に求め、出力する) という問題がわかりません><; 実行結果が count=0 a=             9 count=1 a=            31    ・    ・    ・ count=49 a= 2632292621536793592856576 となるように作成するらしいのですが・・・。 一応私なりに #include<stdio.h> void main( ) { double a=9; int i; for(i=0; i<50; i++){ a=+3*a+4; printf("count=%d a=%.0lf\n",i,a); } } とやってみたのですが最初がa=31となってしまいます。 どなたか詳しい方教えてください。 よろしくお願いしますm( _ _ )m

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

#include<stdio.h> /* gccでコンパイルしようとしたら怒られた。 正式版の規格か知らんけど http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf の24ページ 5.1.2.2.1 Program startupを見ると 戻り値はintみたいなので記述を訂正。 */ int main( void ) { double a=9; int i; for(i=0; i<50; i++){ printf("count=%d a=%.0lf\n",i,a); a=+3*a+4; /* 後ろに持っていった */ } }

drakabu
質問者

お礼

早速のありがとうございます! 実行できました!

その他の回答 (4)

  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.5

こんなコードを書いて、こんな結果を得ました。 検算してみてください。 #include <stdio.h> #define SIZE (7) void printArray(int *arr, int sz, int n) { int i, j; printf("count=%2d : ", n); for (i = sz - 1; i >= 0; i--) { if (arr[i] != 0) { break; } } for (j = sz - i; j > 0; j--) { printf(" "); } printf("%4d", arr[i]); for (j = i - 1; j >= 0; j--) { printf("%04d", arr[j]); } putchar('\n'); } void getNextNumber(int *arr, int sz) { int i; for (i = 0; i < sz; i++) { arr[i] *= 3; } arr[0] += 4; for (i = 0; i < sz - 1; i++) { if (arr[i] >= 10000) { arr[i+1] += arr[i] / 10000; arr[i] %= 10000; } } } int main(void) { int array[SIZE] = { 0 }, i; array[0] = 9; for (i = 0; i < 50; i++) { printArray(array, SIZE, i); getNextNumber(array, SIZE); } return 0; } [結果] count= 0 : 9 count= 1 : 31 count= 2 : 97 count= 3 : 295 count= 4 : 889 count= 5 : 2671 count= 6 : 8017 count= 7 : 24055 count= 8 : 72169 count= 9 : 216511 count=10 : 649537 count=11 : 1948615 count=12 : 5845849 count=13 : 17537551 count=14 : 52612657 count=15 : 157837975 count=16 : 473513929 count=17 : 1420541791 count=18 : 4261625377 count=19 : 12784876135 count=20 : 38354628409 count=21 : 115063885231 count=22 : 345191655697 count=23 : 1035574967095 count=24 : 3106724901289 count=25 : 9320174703871 count=26 : 27960524111617 count=27 : 83881572334855 count=28 : 251644717004569 count=29 : 754934151013711 count=30 : 2264802453041137 count=31 : 6794407359123415 count=32 : 20383222077370249 count=33 : 61149666232110751 count=34 : 183448998696332257 count=35 : 550346996088996775 count=36 : 1651040988266990329 count=37 : 4953122964800970991 count=38 : 14859368894402912977 count=39 : 44578106683208738935 count=40 : 133734320049626216809 count=41 : 401202960148878650431 count=42 : 1203608880446635951297 count=43 : 3610826641339907853895 count=44 : 10832479924019723561689 count=45 : 32497439772059170685071 count=46 : 97492319316177512055217 count=47 : 292476957948532536165655 count=48 : 877430873845597608496969 count=49 : 2632292621536792825490911

回答No.4

致命的なバグ発見。以下のように修正 (数値が合わない理由は不明。とりあえず以下のコードで20番目あたりの数値は#1の回答で示したコードの数値と同じだったことを確認している) void printBigNumber(BigNumber x){ int i; int trail = 1; for (i = BIGNUMBER_MAX - 1;i >= 0 ;i--){ if (x.bit[i] != 0 || trail == 0){ assert((0 <= x.bit[i] && x.bit[i] <= 9)); printf("%d",x.bit[i]); trail = 0; } } printf("\n"); }

回答No.3

>右の方の数桁は正しく出力しないはずです。 確認しました。 C言語をマトモに勉強したわけじゃないから 多分楽な書き方とかライブラリとかあるんだろうなあ…と思いながら 作ってみました。・・・・・が。 数が合いません。何か間違ってますかね? 49:263229262153679282549911 ================================================== #define BIGNUMBER_MAX (50) typedef struct BigNumber{ /* 数値格納用配列 0-9 までのうち、どれかが入る。 実際にはintの最大値まで入れられるようにしたほうが効率がいいんだろう */ int bit[2 * BIGNUMBER_MAX]; /* オーバーフロー検出用 */ int offlag; } BigNumber; /*プロトタイプ宣言*/ void printBigNumber(BigNumber); BigNumber fromint(int); BigNumber canonicalize(BigNumber); BigNumber multiple(BigNumber,BigNumber); BigNumber plus(BigNumber,BigNumber); BigNumber canonicalize(BigNumber x){ int i; int r; BigNumber z; z = fromint(0); r = 0; for (i = 0;i < BIGNUMBER_MAX ;i++){ z.bit[i] = (x.bit[i] + r) % 10; r = (x.bit[i] + r) / 10; } if (r != 0){ z.offlag = 1; }else{ z.offlag = 0; } return z; } BigNumber multiple(BigNumber x,BigNumber y){ BigNumber z; z = fromint(0); int i; int j; for (j = 0;j < BIGNUMBER_MAX ;j++){ for (i = 0;i < BIGNUMBER_MAX ;i++){ z.bit[i+j] += x.bit[i] * y.bit[j]; } } return canonicalize(z); } BigNumber plus(BigNumber x,BigNumber y){ BigNumber z; z = fromint(0); int i; for (i = 0;i < BIGNUMBER_MAX ;i++){ z.bit[i] = x.bit[i] + y.bit[i]; } return canonicalize(z); } BigNumber fromint(int x){ BigNumber z; int i; for (i = 0;i < BIGNUMBER_MAX ; i++ ){ z.bit[i] = x % 10; x = x / 10; } return z; } void printBigNumber(BigNumber x){ int i; for (i = BIGNUMBER_MAX - 1;i >= 0 ;i--){ if (x.bit[i] != 0){ printf("%d",x.bit[i]); } } printf("\n"); } int main( void ) { BigNumber a = fromint(9); int i; for(i=0; i< 50; i++){ printf("%d:",i); if (a.offlag == 1){ printf("オーバーフローしました"); break; }else{ printBigNumber(a); } a = plus(multiple(a,fromint(3)),fromint(4)); printf("\n"); } }

  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.2

> count=49 a= 2632292621536793592856576 ことはそう単純ではなさそうです。 double型で正確に表わせる範囲を超えていますので、 右の方の数桁は正しく出力しないはずです。 また、int型で表わせる範囲も超えています。 配列か何かを使って、何桁かごとに区切って保持する必要がありそうです。

drakabu
質問者

お礼

確かに実行してみたら右のほうが正しくありませんでした…。 double型でも範囲があったのですね;; アドバイスありがとうございます! 配列についても勉強してみます。

関連するQ&A