- 締切済み
複数のfor文
for文を用いて a[0][0][0][0][0][0][0][0][0] a[0][0][0][0][0][0][0][0][1] a[0][0][0][0][0][0][0][0][2] a[0][0][0][0][0][0][0][1][0] a[0][0][0][0][0][0][0][1][1] a[0][0][0][0][0][0][0][1][2] a[0][0][0][0][0][0][1][0][0] a[0][0][0][0][0][0][1][0][1] a[0][0][0][0][0][0][1][0][2] ............................ ............................ a[1][1][1][1][1][1][1][1][0] a[1][1][1][1][1][1][1][1][1] a[1][1][1][1][1][1][1][1][2] のように、下1ケタは0,1,2の繰り返しで 上8桁は2進数で増加するものを表示する プログラムを作成したいと考えています。 0と1の出るタイミングに周期があるのはわかるのですが どうプログラミングすれば良いのかわかりません。 よろしくお願いします。
- みんなの回答 (7)
- 専門家の回答
みんなの回答
No6です。全くもって失礼しました。 暇な年寄り得意の早とちりで・・、申し訳ない。 (「9つのfor文」なんて質問しないよなぁ、すまん) ★「1つの for文で・・」ということですね。 ↑この解釈も間違っている???、やっとヒラメいたんだが。 (下のプログラムの結果が、No1,2さんの結果と違うし、でも、質問本文と合致) 【想定】 ・9列(桁)のそろばんで、上8列が玉1つずつ、下1列は玉2つ(▲)。 ・下1列の繰り上がりで直近上位列の玉上げ(◆)、以降順次。 これをコーディングすると #include <stdio.h> #define MATSUBI (3) // (8) void main() { int iHedVal = 0, iBtmVal, j; for( j = 0; j < ( 0x0100 * MATSUBI ); j++ ){ iBtmVal = j % MATSUBI; // ▲ printf( "%3d %3d a", j, iHedVal ); printf( "[%d]", ( ( iHedVal & 0x0080 ) >> 7 ) ); printf( "[%d]", ( ( iHedVal & 0x0040 ) >> 6 ) ); printf( "[%d]", ( ( iHedVal & 0x0020 ) >> 5 ) ); printf( "[%d]", ( ( iHedVal & 0x0010 ) >> 4 ) ); printf( "[%d]", ( ( iHedVal & 0x0008 ) >> 3 ) ); printf( "[%d]", ( ( iHedVal & 0x0004 ) >> 2 ) ); printf( "[%d]", ( ( iHedVal & 0x0002 ) >> 1 ) ); printf( "[%d]", ( ( iHedVal & 0x0001 ) >> 0 ) ); // 統一表現 printf( "[%d]", iBtmVal ); printf( "\n" ); if( ( MATSUBI - 1 ) == ( j % MATSUBI ) ) iHedVal++; // ◆ } } 注:全角空白でインデントしています(エディタでタブに置換して下さい)。 解説するまでもないけど、上8桁の数字を★マスクして出力★してるだけです(【想定】より単純じゃん、とツッコミが入りそう)。
>上8桁は2進数で増加するものを表示する ★「表示する」だけのプログラムを作成したい、ですか??? >0と1の出るタイミングに周期があるのはわかるのですが ★まったく意味不明です、質問本文に「for文を用いて」とあるのに??。 ・「for文を用いて」と実現の方法が判っているのに質問されたこと ・私の結果(数列)が、No1,2 さんの結果とまるっきし異なること (環境BorlandC++5.5.1) ・「小学校の算数」もでてこないこと ★これらから、ご質問主旨を外しているのを覚悟で・・(No3さんだけが頼り)。 #include <stdio.h> void main() { int i1, i2, i3, i4, i5, i6, i7, i8, k; for( i1 = 0; i1 < 2; i1++ ){ for( i2 = 0; i2 < 2; i2++ ){ for( i3 = 0; i3 < 2; i3++ ){ for( i4 = 0; i4 < 2; i4++ ){ for( i5 = 0; i5 < 2; i5++ ){ for( i6 = 0; i6 < 2; i6++ ){ for( i7 = 0; i7 < 2; i7++ ){ for( i8 = 0; i8 < 2; i8++ ){ for( k = 0; k < 8; k++ ){ printf( "a" ); printf( "[%d]", i1 ); printf( "[%d]", i2 ); printf( "[%d]", i3 ); printf( "[%d]", i4 ); printf( "[%d]", i5 ); printf( "[%d]", i6 ); printf( "[%d]", i7 ); printf( "[%d]", i8 ); printf( "[%d]", k ); printf( "\n" ); } } } } } } } } } } 注:全角空白でインデントしています。
- nak777r
- ベストアンサー率36% (49/136)
問題 1234 という数字の 100の位の数字2を取出すにはどうしたらよいか のみで回答しようと思ったのですが、やり取りが面倒なのでいきなり解説 1234 を 100で割ると 12.34 小数点以下切捨てで 12 12 を 10で割った余りは 2 では、なぜ 100で割るのか、その後、なぜ10で割った余りなのか 100 は、1の位が10進数で、10の位が10進数だから 10×10=100 その後の なぜ10で割った余りなのかは、100の位が 10進数だからです 同じことがスレ主の問題にも言えます 1234は値的に大きいので15で説明します 最初の質問にあった、1の位が、0~2の3進数 10の位から0~1の2進数で説明します 1の位は 15 を 3進数なので、3 で割った余り =0 10の位は 15 を 1の位が3進数なので3で割った物(5)に10の位が2進数なので2で割った余り=1 100の位は 15 を 3進数×2進数(6)で割ったもの(2.5 小数点以下切捨てで2) に100の位が2進数なので、2で割った余り=0 1000の位は、15 を 3進数×2進数×2進数(12)で割ったもの(1.25 小数点以下切捨てで1) に1000の位が2進数なので、2で割った余り=1 で、答えは、1010になります 後からの質問にある、1の位が0~7の8進数 10の位から0~1の2進数 もおんなじ用に考えることができます。 自分が最初に記述したのは、上記算出をプログラムしたものなので自分で考えてください はっきりいって小学校の算数ですよ
- yaemon_2006
- ベストアンサー率22% (50/220)
> 1ケタ目が0から7まで増加するように > したければどうすれば良いですか? 同じようにすればいい。
- Tacosan
- ベストアンサー率23% (3656/15482)
な~んにも考えずに 9個の for をネストすればいいだけ (苦笑) では? 面倒だけど.
- yaemon_2006
- ベストアンサー率22% (50/220)
#include <stdio.h> int main(void) { int a[9] = {0}, i, j, k; while(!a[0]){ a[8] ++; j = a[8] / 3; a[8] = a[8] % 3; for(i = 7; j; i --){ a[i] += j; j = a[i] / 2; a[i] %= 2; } for(i = 0; i < 9; i ++) printf("%d ", a[i]); putchar('\n'); } for(i = 0; !a[0]; i ++){ a[8] = i % 3; j = i / 3; for(k = 7; j; k --){ a[k] = j % 2; j /= 2; } for(k = 0; k < 9; k ++) printf("%d ", a[k]); putchar('\n'); } return 0; }
- nak777r
- ベストアンサー率36% (49/136)
計算で求めるなら i=データ 1の位は、i%3 10の位は、(i/3)%2 100の位は、(i/3/2)%2 1000の位は、(i/3/2/2)%2 こんな感じ #include <stdio.h> int main(int argc, char*argv) { int i,j; double d1; int d2; int ans; char buf[32]; for(i=0; i<256; i++ ){ memset(buf, 0x00, sizeof(buf)); d1 = (double)i; d2 = 3; for( j=0; j<10;j++){ if( j == 1 ){ d1 /=3; } else if( j > 1 ){ d1 /=2; } ans = (int)(d1) % d2; d2 = 2; buf[j] = '0' + ans; } printf( "%s\n", buf ); } return(0); }
お礼
ありがとうございます。 もし a[0][0][0][0][0][0][0][0][0] a[0][0][0][0][0][0][0][0][1] a[0][0][0][0][0][0][0][0][2] a[0][0][0][0][0][0][0][0][3] a[0][0][0][0][0][0][0][0][4] a[0][0][0][0][0][0][0][0][5] a[0][0][0][0][0][0][0][0][6] a[0][0][0][0][0][0][0][0][7] のように、1ケタ目が0から7まで増加するように したければどうすれば良いですか?
お礼
ありがとうございます。 もし a[0][0][0][0][0][0][0][0][0] a[0][0][0][0][0][0][0][0][1] a[0][0][0][0][0][0][0][0][2] a[0][0][0][0][0][0][0][0][3] a[0][0][0][0][0][0][0][0][4] a[0][0][0][0][0][0][0][0][5] a[0][0][0][0][0][0][0][0][6] a[0][0][0][0][0][0][0][0][7] のように、1ケタ目が0から7まで増加するように したければどうすれば良いですか?