题目:

给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫Kaprekar常数。
例如,我们从6767开始,将得到
7766 – 6677 = 1089
9810 – 0189 = 9621
9621 – 1269 = 8352
8532 – 2358 = 6174
7641 – 1467 = 6174
… …
现给定任意4位正整数,请编写程序演示到达黑洞的过程。

输入格式:

输入给出一个(0, 104)区间内的正整数N。

输出格式:

如果N的4位数字全相等,则在一行内输出“N – N = 0000”;否则将计算的每一步在一行内输出,直到6174作为差出现,输出格式见样例。注意每个数字按4位数格式输出。

输入样例1:

6767

输出样例1:

7766 – 6677 = 1089
9810 – 0189 = 9621
9621 – 1269 = 8352
8532 – 2358 = 6174

输入样例2:

2222

输出样例2:

2222 – 2222 = 0000

思路:

用字符串接收数据,排序后转换为数字做运算,再转换回字符串输出

踩坑:

  • 题目说了会输入4位不相同的正整数,但是实际上可能会输入小于四位的数字,此时要在前面补0(否则2,3,4测试点运行超时或答案错误,一直怀疑运行超时是不是用了很多atoi和to_string之类的函数,但事实是处理不当导致循环无法结束)
  • 在进行数字运算的过程中也可能出现不足四位的数字,最后输出时要在前面补0
  • 会有输入数字为6174的情况,对此数字也要进行处理

代码:

#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;int cmp(char a, char b){return a > b;
}int main(){string input;cin >> input;string temp = input;temp.insert(0, 4 - temp.length(), '0');string temp1;string temp2;//处理相同数字的情况int flag = 1;for(int i = 0; i < 3; ++i){if(temp[i] == temp[i+1]){flag = 1;}else{flag = 0;break;}}if(flag){printf("%s - %s = 0000\n", temp.c_str(), temp.c_str());}else{//先执行一次,处理第一个数字是6174的情况do{sort(temp.begin(), temp.end(), cmp);temp1 = temp;sort(temp.begin(), temp.end());temp2 = temp;temp =  to_string(stoi(temp1) - stoi(temp2));temp.insert(0, 4 - temp.length(), '0');printf("%s - %s = %s\n", temp1.c_str(), temp2.c_str(), temp.c_str());}while(temp != "6174");}return 0;
}

优化:

字符串中的数字全部相同的话,想减自然为0,而在前面会补0到4位,可以跟普通情况一起输出,就不用额外判断是不是相同数字了。

#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;int cmp(char a, char b){return a > b;
}int main(){string input;cin >> input;string temp = input;temp.insert(0, 4 - temp.length(), '0');string temp1;string temp2;do{sort(temp.begin(), temp.end(), cmp);temp1 = temp;sort(temp.begin(), temp.end());temp2 = temp;temp =  to_string(stoi(temp1) - stoi(temp2));temp.insert(0, 4 - temp.length(), '0');printf("%s - %s = %s\n", temp1.c_str(), temp2.c_str(), temp.c_str());}while(temp != "6174" && temp != "0000");return 0;
}

学到和回忆了:

  • 用insert函数对数字字符串补0

参考的解析:

1019. 数字黑洞 (20)-PAT乙级真题

PAT乙级练习题1019 数字黑洞相关推荐

  1. 【PAT乙级】1019 数字黑洞 (20 分)

    https://pintia.cn/problem-sets/994805260223102976/problems/994805302786899968 注意补前导零. 例: 输入 9 应为0009 ...

  2. C语言PAT刷题 - 1019 数字黑洞

    作者的话:若有朋友复制代码去PAT试着运行遇到问题的: 1.可能是格式问题,可以先把从本站复制的代码粘贴到记事本,再把记事本里的代码复制,然后粘贴到PAT的代码区,提交本题回答,应该就可以了: 2.可 ...

  3. C++学习之路 | PTA乙级—— 1019 数字黑洞 (20分)(精简)

    1019 数字黑洞 (20分) 给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字.一直重复这 ...

  4. PAT (Basic Level) Practice1019 数字黑洞

    1019 数字黑洞 一.题目 给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字.一直重复这样 ...

  5. 1019 数字黑洞 (20)

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

  6. 1019数字黑洞(一个月前的我和现在的我.jpg)

    1019 数字黑洞 (20 分) 给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字.一直重复 ...

  7. 终于刷完PAT乙级练习题

    今天终于刷完了PAT乙级练习题,从6月14号开始,本来计划一天两道题,开始时进度缓慢,一道题要好久,后面慢慢速度就上来了,最后20道拿来模拟计时训练,四次模拟总算是有提高. 晒一下排名,哈哈 木可堂主 ...

  8. 1019. 数字黑洞

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

  9. pat 乙级 1019 数字黑洞(C++)

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

最新文章

  1. edittext 监听无效_Android中EditText 设置 imeOptions 无效问题的解决方法
  2. 如何用visual studio 2019配置OnnxRuntime
  3. [转]只让指定的机器连接SQLServer服务器
  4. python设置坐标轴刻度值字体大小_python 设置xlabel,ylabel 坐标轴字体大小,字体类型...
  5. 数论相关:同余方程与同余方程组的解法
  6. windows10大瘦身 - 关闭lync的日志记录
  7. eclipse plugin 菜单
  8. .net fileupload批量上传可删除_【JavaWeb基础】文件上传和下载(修订版)
  9. git head指向老版本_Git最全总结
  10. Demo分享丨看ModelArts与HiLens是如何让车自己跑起来的
  11. JavaScript的可变参数介绍
  12. 云计算与云原生 — ETCD 数据库完全解析
  13. 本特利990-05-50-02-00变送器
  14. VC编程获取和修改环境变量,不重启系统即时生效
  15. XP 删除微软拼音 3.0
  16. 模电学习笔记(八)——差分放大器
  17. Linux 环境部署|Anaconda及Tensorflow
  18. 创建Vue项目的两种方法(镜像和官网)
  19. 顶会 INFOCOM 巴黎进行时,最高荣誉花落微软老将
  20. 计算机安全的基本概念,计算机安全包括哪几个方面

热门文章

  1. 不要把Which side your bread is buttered on翻译成“你的面包哪一面涂了黄油”!|10:00
  2. pb将字符串s中的c1替换为c2
  3. 显式曲线 隐式曲线 曲率公式推导
  4. 超经典电影语录13句
  5. redirect使用
  6. 为赋新词强说愁之一(儿时的那些事儿啊)
  7. datax同步oracle数据到hbase,hbase的rowkey使用hash生成
  8. 医疗健康行业的企业营销要如何做好软文发布推广?
  9. CocosCreator 龙骨换装
  10. 进入新公司的工作方法