1. 程式人生 > >浙大pat | 浙大pat牛客網乙級1009

浙大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

輸出描述:

如果N4位數字全相等,則在一行內輸出“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;

}