/**********************************************************************/ /* Cmagazine 1995.07 電脳クラブ */ /* 標 題 カウント・ワン */ /* */ /* 解 答 83 個 */ /* */ /* 使用機種 FMR-50NL (i486sx 25MHz) */ /* O S MS-DOS Ver6.2 */ /* コンパイラ LSI C-86 Ver3.30C(試食版) */ /* 実行時間 1 秒 */ /* */ /**********************************************************************/ #include #include #define HYOJI 0 /* Nを全て表示するなら1にする */ #define KETA 10 /* Nは理論上10桁が限界 */ /* グローバル変数 */ int enu[KETA]; /* Nの値 (BCD表現配列) */ int one[KETA]; /* Nまでの1の個数(BCD表現) */ int kosu=0; /* 条件を満たすNの個数(解答) */ /* BCD表現配列の繰り上がり下がり整理 */ int seiri(int table[]) { int i; for (i=0; i9) { table[i] -= 10; table[i+1]++; } } /* 10桁を越えていれば真を返す */ return (table[KETA-1] / 10); } /* 1の個数>N の場合の探索ジャンプ */ int jump1(void) { int i; /* N=(1の個数)とする */ for (i=0; i=0; i--) printf("%d",enu[i]); printf(" (%d個目)\n",kosu); } #endif /* 次の探索のためにN++ */ enu[0]++; /* enu を整理し10桁を越えたら真を返す */ return (seiri(enu)); } /* 1の個数<N の場合の探索ジャンプ */ int jump2(void) { int i, status=0, sa[KETA]; /* Nと(1の個数)の差を求める */ for (i=0; i 1) one[i]++; } } /* 10桁を越えた場合大小比較返り値以外を返す */ if (seiri(one)) return 2; /* one と enu を大小比較し結果を返す */ for (i=KETA-1; i>=0; i--) { if (one[i] > enu[i]) return 1; if (one[i] < enu[i]) return -1; } return 0; } /* メイン処理 */ void main(void) { int i, end_flag=0; /* N=1(初期化) */ enu[0]=1; for (i=1; i