プログラミングの美しさ2.8条件に合致する整数を探す


この問題は、1つの整数Nを与えるには、N*Mで得られた結果の10進数表現に1と0の2つの数字しか存在しないように、別の整数Mを探す必要があるということです.まずこの問題を見て、第一思想は間違いなくM=1にして、それによってMの値を増やして、N*Mが所望の効果を得るまで、しかし、Nが大きいならば、計算量もとても大きくて、だから、私達はもっと良い解決方法を求める必要があります.
本の中の解決方法は少し複雑で、ここで私が紹介した方法も非常に簡単で、逆に問題を考えて、私たちは1と0しか含まれていない数字でNを除去して、もし余剰数が0であれば、Mを見つけて、Mはその数字に等しいNを除去します.
上記の考え方で問題を解決するにはコードを書くのは難しくありません.キューを定義すればいいです.そして、大きいから小さいまで「適当」な数字をキューに入れ、Nを順番に除いて残数を見ればいいです.
関数は次のように宣言されます.
/*2.8         */
void DutFindNumMakeMultipleOnlyHasOneOrZero(int);

ソースコードは次のとおりです.
/*     ,         ,      1 0(     )*/
/*          ,  ,       ,        */
void DutFindNumMakeMultipleOnlyHasOneOrZero(int n)
{
	if (n <= 0)
		return;

	queue<long long> q;
	q.push(1);

	while (1)
	{
		long long t = q.front();
		q.pop();

		if (t % n == 0)
		{
			cout << t << " = " << n << " * " << t / n << endl;

			break;
		}

		/*           1 0           ,      0   */
		q.push(10 * t);
		q.push(10 * t + 1);
	}
}