トピックコンテンツ
桁が完全に同じではない4桁の正の整数が与えられた場合、最初に4つの数値を増加せずに並べ替え、次に減少せずに並べ替えてから、最初の数値から2番目の数値を引くと、新しい数値が得られます。これを何度も繰り返してください。すぐに「デジタルブラックホール」と 6174
呼ばれるカプレカー定数としても知られる魔法の数に立ち止まります。
たとえば、から6767
始めて、
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
... ...
ここで、任意の4桁の正の整数が与えられた場合、ブラックホールに到達するプロセスを示すプログラムを作成します。
入力フォーマット:
入力は、区間(0,104)に正の整数Nを与えます。
出力フォーマット:
Nの4桁がすべて等しい場合は、1行で出力し N - N = 0000
ます。それ以外の場合は、計算の各ステップを、違いとして表示されるまで1行で 6174
出力します。出力形式の例を参照してください。4
各数値は数字形式で出力されることに注意してください 。
入力サンプル1:
6767
最後に空白行はありません
サンプル出力1:
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
最後に空白行はありません
入力サンプル2:
2222
最後に空白行はありません
サンプル出力2:
2222 - 2222 = 0000
最後に空白行はありません
問題解決のアイデア
この質問には大きな穴があります!入力データの範囲を注意深く見ないと、入力データは4桁の正の整数であると考えがちですが、範囲は
この場所で2時間立ち往生し、常に3つのデータポイントを通過する必要がありました。
質問をクリアした後、入力データが4桁の数値でない場合は、「0を埋める」操作を行う必要があります。つまり、Stringに付属のinsert()関数を使用して、開始位置に0を追加して作成します。 4桁の数字。
質問の要件を満たすためにループを作成します。ループの終了条件は、6174に加えて0000であることに注意してください。
詳細なコード
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
bool cmp(char a,char b) {
return a > b;
}
int main()
{
string ans;
cin >> ans;
ans.insert(0, 4 - ans.length(), '0');//insert函数,表示在0位置插入长度为4-ans.length()的‘0’
do {
string s1, s2;
s1 = ans, s2 = ans;
sort(s1.begin(), s1.end());
sort(s2.begin(), s2.end(), cmp);
ans = to_string(stoi(s2) - stoi(s1));
ans.insert(0, 4 - ans.length(), '0');
cout << s2 << " - " << s1 << " = " << ans << endl;
} while (ans!="6174" && ans!="0000");
return 0;
}