浙大pat | 浙大pat牛客網乙級1009
題目描述
給定任一個各位數字不完全相同的4位正整數,如果我們先把4個數字按非遞增排序,再按非遞減排序,然後用第1個數字減第2個數字,將得到一個新的數字。一直重複這樣做,我們很快會停在有“數字黑洞”之稱的6174,這個神奇的數字也叫Kaprekar常數。例如,我們從6767開始,將得到
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
... ...
現給定任意4位正整數,請編寫程式演示到達黑洞的過程。
輸入描述:
輸入給出一個(0, 10000)區間內的正整數N。
輸出描述:
如果N的4位數字全相等,則在一行內輸出“N - N = 0000”;否則將計算的每一步在一行內輸出,直到6174作為差出現,輸出格式見樣例,每行中間沒有空行。注意每個數字按4位數格式輸出。
輸入例子:
6767
輸出例子:
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
浙大Pat乙級的題目都不難,就是非常的複雜,正好鍛鍊一下寫程式碼的速度
這一題的知識點有,使用sort對string進行排序,cmp的引數應該是char而不是string,在把char轉換成int的時候和把int轉換成char的時候一定要記住,減去‘0’和加上’0’這一點,老是容易忘記,還有setw(4)和setfill(“0”)貌似只能生效一個數字,假如需要持續生效的話需要每次輸出一個數字都寫一句!
另外這一題還有一個知識點就是使用string做大數減法或者是大數加法的時候要怎麼寫!
#include<iostream>
#include<string>
#include<iomanip>
#include<algorithm>
using namespacestd;
bool cmp(char&a, char &b)
{
return a > b;
}
stringsubTrac(string a, string b)
{
string tmp = "0000"; int carry = 0;
for (int i = 3; i >= 0; i--)
{
if (a[i] - '0' + carry >= b[i] -'0')
{
tmp[i] = (a[i] - '0' + carry -(b[i] - '0')+'0');
carry = 0;
}
else
{
tmp[i] = ((a[i] - '0') +carry+10 - (b[i] - '0')+'0');
carry = -1;
}
}
return tmp;
}
stringout6147(string num)
{
string a = num;
string b = num;
sort(a.begin(), a.end(), cmp);
sort(b.begin(), b.end());
string c = subTrac(a, b);
cout << a << " - "<< b << " = " << c << endl;
return c;
}
int main() {
int num,tmp;
cin >> num;
tmp = num;
string numStr;
for (int i = 0; i < 4; i++)
{
numStr.push_back(tmp % 10+'0');
tmp /= 10;
}
swap(numStr[0], numStr[3]);
swap(numStr[1], numStr[2]);
cout << setw(4) <<setfill('0');
if (numStr[0] == numStr[1]&&numStr[1] == numStr[2]&& numStr[2] == numStr[3])
{
cout << numStr << "- " << numStr << "= " << "0000";
return 0;
}
while((numStr=out6147(numStr))!="6174");
return 0;
}