首页 > 编程知识 正文

浙大pat 浙大pat牛客网乙级1009,浙大pat测试官网

时间:2023-05-06 16:41:28 阅读:233610 作者:4435

 1009

1019. 数字黑洞 (20)

2565

10433

24%

题目描述

给定任一个各位数字不完全相同的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;

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。