P 1019 数字黑洞
转跳点:
给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的 6174,这个神奇的数字也叫 Kaprekar 常数。
例如,我们从6767开始,将得到
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
... ...
现给定任意 4 位正整数,请编写程序演示到达黑洞的过程。
输入格式:
输入给出一个 ( 区间内的正整数 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
这道题我取了一下巧,用来sscanf,因为实在是不想写个各个位相加的了,太麻烦了。这道题吧,还是那句话没什么难点。就是有些小坑
1.结束程序的情况有两个,while (n != 6174 && n != 0)
2.注意一下输入是6174的情况。如果你写的不是先减后判断的退出条件的话那就出现直接推出的情况,但理论上应该输出7641 - 1467 = 6174,所以要么用do……while,
要么换一下逻辑顺序,先减再判断
3.注意一下1000 这种东西输出的时候得是 1000 - 0001 = 999
我踩到的坑就这些,个人感觉是没有其他的了。如果不用sscanf将数组里的数字字符写入变量里那取各个位的时候就要注意记得不足四位要加上0。接着就是贴代码的环节了。
哦,对了,要用到排序,上一篇博客铁锅qsort使用方法,这里就不贴了,记得写两个比较函数,其实自己想练练手写个排序也行。
C:
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 int cmp1(const void *a, const void *b);
5 int cmp2(const void *a, const void *b);
6 void to_array(int a, char b[]);
7
8 int main()
9 {
10 char num[5];
11 int n;
12 scanf("%d", &n);
13 do
14 {
15 to_array(n, num);
16 int max, min;
17
18 qsort(num, 4, sizeof(char), cmp1);
19 sscanf(num, "%d", &min);
20 qsort(num, 4, sizeof(char), cmp2);
21 sscanf(num, "%d", &max);
22 printf("%04d - %04d = %04d\n", max, min, max - min);
23 n = max - min;
24 } while (n != 6174 && n != 0);
25
26
27 return 0;
28 }
29
30 int cmp1(const void *a, const void *b)
31 {
32 return *((char *)a) > *((char *)b) ? 1 : -1;
33 }
34
35 int cmp2(const void *a, const void *b)
36 {
37 return *((char *)a) > *((char *)b) ? -1 : 1;
38 }
39
40 void to_array(int a, char b[])
41 {
42 for (int i = 0; i < 4; i++)
43 {
44 b[i] = a % 10 + '0';
45 a /= 10;
46 }
47 }
C++
1 #include <stdio.h>
2 #include <algorithm>
3 using namespace std;
4
5 bool cmp(int a, int b);
6 void to_array(int a, char b[]);
7
8 int main()
9 {
10 char num[5];
11 int n;
12 scanf("%d", &n);
13 do
14 {
15 to_array(n, num);
16 int max, min;
17
18 sort(num, num + 4);
19 sscanf(num, "%d", &min);
20 sort(num, num + 4, cmp);
21 sscanf(num, "%d", &max);
22
23 printf("%04d - %04d = %04d\n", max, min, max - min);
24 n = max - min;
25 } while (n != 6174 && n != 0);
26
27 return 0;
28 }
29
30 bool cmp(int a, int b)
31 {
32 return a > b;
33 }
34
35 void to_array(int a, char b[])
36 {
37 for (int i = 0; i < 4; i++)
38 {
39 b[i] = a % 10 + '0';
40 a /= 10;
41 }
42 }
其实也没怎么用c++的东西,因为sscanf的关系不能用vector,主要是懒得再开个空间用于memcpy拷贝
PTA不易,诸君共勉!
P 1019 数字黑洞的更多相关文章
- PAT乙级 1019. 数字黑洞 (20)
1019. 数字黑洞 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定任一个各位数字不完全相同的4位 ...
- PAT-乙级-1019. 数字黑洞 (20)
1019. 数字黑洞 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定任一个各位数字不完全相同的4位 ...
- 牛客网 PAT 算法历年真题 1009 : 1019. 数字黑洞 (20)
1019. 数字黑洞 (20) 时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小) 题目描述 给定任一个各位数字不完全相同的4 ...
- PAT 乙级 1019 数字黑洞 (20) C++版
1019. 数字黑洞 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定任一个各位数字不完全相同的4位 ...
- 【PAT】1019 数字黑洞 (20)(20 分)
1019 数字黑洞 (20)(20 分) 给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字.一直重复这样做, ...
- PAT(B) 1019 数字黑洞(Java)
题目链接:1019 数字黑洞 (20 point(s)) 分析 输入正整数n后,将n转成int型数组nArr[4] 用Arrays.sort(int[] a)方法将数组nArr非递减排序 很显然,非递 ...
- PAT——1019. 数字黑洞
给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字.一直重复这样做,我们很快会停在有“数字黑洞”之称的6174 ...
- PAT (Basic Level) Practise (中文)-1019. 数字黑洞 (20)
http://www.patest.cn/contests/pat-b-practise/1019 给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第 ...
- PAT 1019. 数字黑洞 (20)
给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字.一直重复这样做,我们很快会停在有"数字黑洞&qu ...
随机推荐
- 六、java基础-单例模式_继承_覆盖_多态
1.单例模式: 1)提出原因 是由gof 也就是四人组提出来的.为了保证jvm中某一类型的java对象永远只有一个,同时也是为了节省内存的开销.因为外面程序可以通过new的方法直接调用类里面的构造方法 ...
- robotframework+appium 实现App自动化值环境搭建(一)
第一步: Cmd命令输入pip install robotframework-appiumlibrary 下载和导入appiumlibrary 第二步: 安装JDK,附件有JDK1.8安装包 第三步 ...
- java程序员的就业指导(重点)
想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,面试者在面试之前到底需要准备哪些东西呢?本文陈列的这些内容既可以作为个人简历中的内容,也可以作为面试的时候跟面试官聊的东西,你可以把这些内 ...
- android EditText中inputType的属性列表
android 1.5以后添加了软件虚拟键盘的功能,所以在输入提示中将会有对应的软键盘模式 android中inputType属性在EditText输入值时启动的虚拟键盘的风格有着重要的作用.这也大大 ...
- 图解jvm--(一)jvm内存结构
jvm内存结构 1.程序计数器 1.1 定义 Program Counter Register 程序计数器(寄存器) 作用,记住下一条jvm指令的执行地址 特点 是线程私有的 (唯一)不会存在内存溢出 ...
- 【高软作业4】:Tomcat 观察者模式解析 之 Lifecycle
一. 预备 如果你是Windows用户,使用Eclipse,并且想自行导入源码进行分析,你可能需要:Eclipse 导入 Tomcat 源码 如果你已遗忘 观察者模式,那么你可以通过该文章回顾:设计模 ...
- 小程序canvas 变换
var ctx = wx.createCanvasContext('base'); var centerX = 375/ 2; var centerY = 200; var rotate = 90; ...
- 题解 nflsoj489 【六校联合训练 CSP #15】小D与随机
题目链接 考虑枚举好点的集合.此时要考虑的问题是如何填入\(1\sim n\)这些数使得恰好我们枚举到的这些点是好点,即:求出有多少种合法的填数方案. \(1\)号点一定是好点.那么除\(1\)号点外 ...
- 无需重新编译安装PHP扩展的方法
转自:https://www.jianshu.com/p/ae3c17b0f126 PHP扩展模块通常有两种: PHP官方扩展.如果php通过源码安装(php7),安装的时候未开启,而后来需要开启某个 ...
- springMVC,spring和Hibernate整合(重要)
springMVC,spring和Hibernate整合 https://my.oschina.net/hugohxb/blog/184715 第一步:搭建一个springmvc工程,需要的jar有: ...