您的位置:首页 > 其它

浙大pat | 浙大pat牛客网乙级1009

2018-03-07 18:47 429 查看
 10091019. 数字黑洞 (20)25651043324%
题目描述给定任一个各位数字不完全相同的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: