プログラミングの美しさ2.8条件に合致する整数を探す
1055 ワード
この問題は、1つの整数Nを与えるには、N*Mで得られた結果の10進数表現に1と0の2つの数字しか存在しないように、別の整数Mを探す必要があるということです.まずこの問題を見て、第一思想は間違いなくM=1にして、それによってMの値を増やして、N*Mが所望の効果を得るまで、しかし、Nが大きいならば、計算量もとても大きくて、だから、私達はもっと良い解決方法を求める必要があります.
本の中の解決方法は少し複雑で、ここで私が紹介した方法も非常に簡単で、逆に問題を考えて、私たちは1と0しか含まれていない数字でNを除去して、もし余剰数が0であれば、Mを見つけて、Mはその数字に等しいNを除去します.
上記の考え方で問題を解決するにはコードを書くのは難しくありません.キューを定義すればいいです.そして、大きいから小さいまで「適当」な数字をキューに入れ、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);
}
}