PATクラスB1019デジタルブラックホール(20ポイント)

トピックコンテンツ

桁が完全に同じではない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;
}

おすすめ

転載: blog.csdn.net/weixin_45660485/article/details/119298991