• 締切済み

複数の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の出るタイミングに周期があるのはわかるのですが どうプログラミングすれば良いのかわかりません。 よろしくお願いします。

みんなの回答

noname#48699
noname#48699
回答No.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桁の数字を★マスクして出力★してるだけです(【想定】より単純じゃん、とツッコミが入りそう)。

noname#48699
noname#48699
回答No.6

>上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)
回答No.5

問題 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進数 もおんなじ用に考えることができます。 自分が最初に記述したのは、上記算出をプログラムしたものなので自分で考えてください はっきりいって小学校の算数ですよ

回答No.4

> 1ケタ目が0から7まで増加するように > したければどうすれば良いですか?  同じようにすればいい。  

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

な~んにも考えずに 9個の for をネストすればいいだけ (苦笑) では? 面倒だけど.

回答No.2

#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; }

kou6666
質問者

お礼

ありがとうございます。 もし 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まで増加するように したければどうすれば良いですか?

  • nak777r
  • ベストアンサー率36% (49/136)
回答No.1

計算で求めるなら 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); }

kou6666
質問者

お礼

ありがとうございます。 もし 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まで増加するように したければどうすれば良いですか?

関連するQ&A