• ベストアンサー

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% (2126/6288)
回答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% (2126/6288)
回答No.2

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

drakabu
質問者

お礼

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

関連するQ&A

  • c言語の問題

    初期値Aを9とし、A←3*A+4で更新されるAを10回分 順に出力すプログラムをfor文を利用して作成せよ。(暫化式A(i+1)=3*A(i)+4、初期値A(0)=9であらわせる数列のA(0)~A(9)の値を順に出力するプログです。) -------- int i; int a; for (i=0; i<10 i++) {   if (i==0) {    a=9;   } else {    a=3*a+4;   }   printf(”count=%3d   a=%10d¥n”,i,a);  } } この問題の最後らへんの、printf(”count=%3d   a=%10d¥n”,i,a);だけわかりません。これはどういう意味でしょうか。

  • c言語プログラミングについて

    ニュートン法でx^2-2の根を初期値2、試行回数を200回までで求めるプログラムを作成しているのですがうまくいきません。 どなたかご教授お願いいたします。 #include<stdio.h> #include<math.h> int main() { int i; int N = 200; double x = 2.0; double xnew; double eps = 1e-16; for (i = 0; i < N; i++) { xnew = x - ( x * x - 2.0 ) / 2.0 * x; if (fabs(x - xnew) < eps) break; x = xnew; } printf("x=%.20lf\n", xnew); return(0); }

  • C言語 プログラミングで行詰まりました…

    標準入力(キーボード)からi,jk,nの値を入力し、次の漸化式を計算し、X_0からX_nまで求めるプログラムを作成したいのですが、うまく表示されません。どかがおかしいのかご指摘お願いします。 <漸化式> X_n=(a+b)/X_(n-1) , X_0=c(n=0) ================================================================== #include<stdio.h> float f_X(int a,int b,float c) { float y; y=(a+b)/c; return y; } int main (void) { int number,i,j; float k,l,n,X; printf("i:"); scanf("%d", &i); printf("j:"); scanf("%d", &j); printf("k:"); scanf("%f", &k); printf("n:"); scanf("%f", &n); X=k; printf("X_0= %.6f\n",X); for(number=1;number<=n;number++) { l=f_X(i,j,X); printf("X_%d= %.6f \n",number,l); X=l; } return 0; } ===================================================================

  • C言語でまったくわからないところがあります。

    C言語でまったくわからないところがあります。 配列を格納して、その中の最小値をA[9]と入れ替える動作がしたいのですが、 #include<stdio.h> int main(void) { double A[10],min,tmp; int i; for(i=0;i<=9;i++) { printf("A[%d]=",i); scanf("%lf",&A[i]); } printf("\n"); min=A[0]; for(i=0;i<=9;i++) { if(A[i]<min) { min=A[i]; } } tmp=A[i]; A[i]=A[9]; A[9]=tmp; for(i=0;i<=9;i++) { printf("A[%d]=%.0lf\n",i,A[i]); } return 0; } これを実行すると、A[9]=最小値にはなるのですが、A[i]はそのまま入れ替わらないのです。 誰か、どのように直せばよいか、教えていただけないでしょうか。よろしくお願いします。

  • C言語で困っています

    C言語で 100:1 99:2 98:3 .......ループ 1:100とやりたいんですが このやりかたがわかりません goto文などを使うのでしょうか? 一応コードは #include <stdio.h> int main(void) { int i,a; for(i=100; i>=1; i--){ for(a=1; a<=100; a++){ printf("%d:\n",i); break; printf("%d",a); } } return 0; } です まったくこれだと右側が出力されなくてだめみたいです どなたかお知恵をください お願いします

  • C言語の計算についての質問です.

    C言語の計算についての質問です. 1 2 3 4 5 6 2 3 4 5 6 7 3 4 5 6 7 8 というようなファイルを行ごとに読み込んで、列ごとの和を算出させたいと考えています. 以下のようなプログラムをテスト作成してみたのですが,『 b=1のときのa[1] + b=2のときのa[1] 』のような計算ができません. どのようなプログラムを作成すればこの問題が解決できるか教えてください. #include <stdio.h> #include <string.h> int main(void) { FILE *fp; int i, j, k, no, b; double a[12]; double c[3]; char buffer[1024]; for(i=1; i<=2; i++) { sprintf(buffer, "PIVdemo_00%d%d.txt", i/10, i%10); printf("%s \n", buffer); fp = fopen(buffer,"r"); for(b=1; b<=12; b++) { fscanf(fp, "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf", &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7], &a[8], &a[9], &a[9], &a[10], &a[11], &a[12]); printf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf \n", a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[9], a[10], a[11], a[12]); } for(b=0; b<=2; b++){ c[3]=a[b] + a[b+1]; printf("%lf", c[3]); putchar('\n'); } fclose(fp); } return (0); }

  • C言語プログラミング

    プログラミングについてです。 osはLinuxです。 x+logx=0の解を求めるプログラムを作れで ニュートン法を使ってみましたがあってますか? #include <stdio.h> #include <math.h> #define EPS 1e-8 main( ) { double a, old_x, new_x; int i; printf(" a="); scanf("%lf", &a); new_x = a; for(i=1; i<=100; i++) { old_x=new_x; new_x = old_x*(1-log(old_x))/(old_x+1); printf("x%d = %f\n", i,new_x); if(fabs(old_x*(1-log(old_x))/(old_x+1)) < EPS) break; } } いろいろな数字で実行してみた結果 nanと 0.567143の二つに分かれました。 どこか間違いがあるのですか

  • C言語 二分法

    初投稿です。 お恥ずかしながらパソコンが苦手で、Cゲッが難しくてできません。 今回二分法です。 途中まではやったのですができません。 演習 0~1の乱数を12個発生させ,これらの平均をxi,yi とする。(s,tは乱数) xi=1/12(x1i+x2i+....x12i) yi=1/12(y1i+y2i+....y12i) このようなを1000個作り,(xi,yi)で散布図 を作りなさい。またx,yのそれぞれの平均を求 めよ。 この演習で #include<stdio.h> #include<stdlib.h> #include<math.h> #define eps 1.0e-5 float f(double x); void nibuin(void); int main () { int count; double a,b,m; count=0; printf("範囲の左の値を入力してください。\n"); scanf("%lf",&a); printf("範囲の右の値を入力してください。\n"); scanf("%lf",&a); if(count==1000){ printf("収束しませんでした。\n"); exit(1); } } while(!(fabs(a-b)<eps)); printf("解の値は%f\n収束するのに%d回かかりました。"m,count); } float f(double x) { reurn x*sin(x)+log(x); } まではできたのですが、 scanf("%lf",&a);とif(count==1000){の間に入る命令が打てません。 よろしくお願いします。

  • C言語

    #include <stdio.h> #include <stdib.h> int main (void){ double a[5]={0.0,4.0,0.0,-5.0,1.0}; double x; int i,j,k,n; n=4; x=0.75; for(i=1;i<=n;i++) printf("%10.5f ,",a[i]); printf("\n"); for (i=1; i<=n+1; i++) printf("----------") printf("\n"); while(n>=1){ for(i=1; i<=n; i++) a[i]=a[i-1]*x+a[i]; for(i=1; i<=n; i++) prontf("%10.5f ,"a[i]); printf("\n"); n=n-1; } return 0; }

  • C言語を使用したプログラミング方法で質問です。

    以下の処理にバブルソートで小さい順からの比較結果をprintfで出力したいのですが、どこにバブルソートを追加すればよろしいですか? 追加した文を教えて頂けますか? 今は値を16進数から10進数に変換した数字を出力しているが、これを小さい順に出力したいんです。 宜しくお願いします。 #include <stdio.h> int main (void) { char data[256]; int val[100]; int i = 0; int k; printf("入力 = "); scanf("%s",data); for(i=0;i<100;i++){ val[i] = 0; } k=0; for(i = 0;i<100 ; i++){ if(data[i] == 0x00){ //data[i]がNULLだったら処理を抜ける k++; break; //enterキーでprintf出力 } else if(data[i] == ','){ //カンマだったら /*printf("%d\n",k);*/ k++; } else{ if(data[i] >= 'A' && data[i] <= 'Z'){ //data[i]にAからZが入ったら val[k] = val[k] *16 + data[i] -'A'+10; } else if(data[i] >= '0' && data[i] <= '9'){ //data[i]に0から9が入ったら val[k] = val[k] *16 + data[i] -'0'; } } } /*printf("%d\n",k);*/ for(i=0;i<k;i++){ printf("出力 = %d\n",val[i]); } }