• 締切済み

配列要素の平坦化

C言語の簡単なアルゴリズムが思い付かず。 下記を x[10] = {1,1,1,1,1,1,0,0,0,0} y[10] = {1,1,1,0,0,0,0,0,0,0} z[10] = {1,1,1,0,0,0,0,0,0,0} 下記に x[10] = {1,1,1,1,0,0,0,0,0,0} y[10] = {1,1,1,1,0,0,0,0,0,0} z[10] = {1,1,1,1,0,0,0,0,0,0} したいのですが、 簡単にできないかなあと

みんなの回答

  • heburusu
  • ベストアンサー率85% (140/164)
回答No.1

こんにちわ。 配列要素が"1"と"0"だけなのでしたら、 x,y,zの1が含まれる数を数えた合計を3で割った値+余りで計算できるように思います。 若干冗長な書き方かもしれませんが、以下のようになります。 #"1"の数を計算 int count=0; for(int i=0; i<10; i++) { count += x[i]; count += y[i]; count += z[i]; } #商と余りを計算 int syou = count / 3; int amari = count % 3; #"0"で初期化しなおし for(int i=0; i<10; i++) { x[i] = y[i] = z[i] = 0; } #"商の分だけ"1"で埋める int i; for(i=0; i<syou; i++){ x[i] = y[i] = z[i] = 1; } #余りの分の"1"を埋める if(amari > 0) { x[i+1] = 1; amari--; } if(amari > 0) { y[i+2] = 1; } 配列要素に1or0以外が含まれていて総和を平坦化したいような場合は、 最適化アルゴリズムなどの話で詳しくわかりません・・・。

関連するQ&A