PAT乙级真题:C++:数字黑洞

﹏ヽ暗。殇╰゛Y 2022-12-23 00:59 255阅读 0赞

题目描述

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

题解

需要注意几个地方:

  • 不足四位数,在输出时要补齐四位。
  • 当6174作为差出现时,才停止循环。

代码

C++版本:

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <string>
  4. #include <vector>
  5. using namespace std;
  6. //数字降序排序
  7. int getMax(int num) {
  8. vector<int> v;
  9. while(num>0) {
  10. v.push_back(num%10);
  11. num/=10;
  12. }
  13. sort(v.begin(),v.end());
  14. while(v.size()<4) {
  15. v.insert(v.begin(),0);
  16. }
  17. return v[0]+10*v[1]+100*v[2]+1000*v[3];
  18. }
  19. //数字升序排序
  20. int getMin(int num) {
  21. vector<int> v;
  22. while(num>0) {
  23. v.push_back(num%10);
  24. num/=10;
  25. }
  26. sort(v.begin(),v.end());
  27. while(v.size()<4) {
  28. v.insert(v.begin(),0);
  29. }
  30. return v[3]+10*v[2]+100*v[1]+1000*v[0];
  31. }
  32. //打印输出数字,不足四位数则补齐
  33. void print(int num) {
  34. if(num<10) {
  35. cout<<"000";
  36. } else if(num<100) {
  37. cout<<"00";
  38. } else if(num<1000) {
  39. cout<<"0";
  40. }
  41. cout<<num;
  42. }
  43. int main() {
  44. int num;
  45. cin>>num;
  46. while(true) {
  47. int max=getMax(num);
  48. int min=getMin(num);
  49. if(max==min) {
  50. cout<<"N - N = 0000";
  51. return 0;
  52. }
  53. print(max);
  54. cout<<" - ";
  55. print(min);
  56. cout<<" = ";
  57. print(max-min);
  58. cout<<endl;
  59. num=max-min;
  60. if(num==6174) break;
  61. }
  62. }

在讨论区看到一个python版本代码,深感简洁度上的差距。一并贴在这里,作为启发。

  1. num = input()
  2. def calc(num):
  3. if len(set(num)) == 1:
  4. print(num + " - " + num + " = 0000")
  5. return "6174"
  6. else:
  7. num1 = "".join(sorted(num, reverse=True))
  8. num2 = "".join(sorted(num))
  9. result = str(int(num1) - int(num2))
  10. print(num1 + " - " + num2 + " = " + result)
  11. return result
  12. num=calc(num.ljust(4,"0"))
  13. while num != "6174":
  14. num = calc(num.ljust(4,"0"))

发表评论

表情:
评论列表 (有 0 条评论,255人围观)

还没有评论,来说两句吧...

相关阅读

    相关 PAT 1019 数字黑洞

    给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“

    相关 PAT-B 1019. 数字黑洞 (20)

    给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“

    相关 PAT~乙级~1019 数字黑洞 ~python

    题目描述: 给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字。一直