转跳点:

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 数字黑洞的更多相关文章

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

    1019. 数字黑洞 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定任一个各位数字不完全相同的4位 ...

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

    1019. 数字黑洞 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定任一个各位数字不完全相同的4位 ...

  3. 牛客网 PAT 算法历年真题 1009 : 1019. 数字黑洞 (20)

    1019. 数字黑洞 (20) 时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小) 题目描述 给定任一个各位数字不完全相同的4 ...

  4. PAT 乙级 1019 数字黑洞 (20) C++版

    1019. 数字黑洞 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定任一个各位数字不完全相同的4位 ...

  5. 【PAT】1019 数字黑洞 (20)(20 分)

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

  6. PAT(B) 1019 数字黑洞(Java)

    题目链接:1019 数字黑洞 (20 point(s)) 分析 输入正整数n后,将n转成int型数组nArr[4] 用Arrays.sort(int[] a)方法将数组nArr非递减排序 很显然,非递 ...

  7. PAT——1019. 数字黑洞

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

  8. PAT (Basic Level) Practise (中文)-1019. 数字黑洞 (20)

    http://www.patest.cn/contests/pat-b-practise/1019 给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第 ...

  9. PAT 1019. 数字黑洞 (20)

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

随机推荐

  1. 转:Nginx的超时keeplive_timeout配置详解

    https://blog.csdn.net/weixin_42350212/article/details/81123932 Nginx 处理的每个请求均有相应的超时设置.如果做好这些超时时间的限定, ...

  2. C++ 一篇搞懂继承的常见特性

    微信公众号:「小林coding」 用简洁的方式,分享编程小知识. 继承和派生 01 继承和派生的概念 继承: 在定义一个新的类 B 时,如果该类与某个已有的类 A 相似(指的是 B 拥有 A 的全部特 ...

  3. shell命令、调度工具、后台执行线程和软连接

    一.shell命令 1.后缀.sh 第一行需要加#!/bin/bash 没有的话,需呀sh 命令执行 示例test.sh: #!/bin/bash date ./test.sh 提示没有权限,此时,需 ...

  4. 部署 Prometheus Operator【转】

    本节在实践时使用的是 Prometheus Operator 版本 v0.14.0.由于项目开发迭代速度很快,部署方法可能会更新,必要时请参考官方文档. 下载最新源码 git clone https: ...

  5. HomePod即将发售,但硬件不再是苹果的救命稻草

    流年不利的苹果,在多个维度都遭到了重创.除了与高通纠缠不清的专利官司外,iPhone销量还直线下滑并影响到营收.最终,苹果股价.市值都处于暴跌态势.面对内外夹击的不利局面,苹果信奉多年的"封 ...

  6. 连接mysql报错java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized...解决方法

    报错内容: java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represents mo ...

  7. other#docker

    阿里云docker镜像加速地址:https://cr.console.aliyun.com/#/accelerator docker 安装: yum install -y yum-utils devi ...

  8. 让SVG以组件的方式引入吧!

    安装 npm i -D vue-svg-loader or yarn add -D vue-svg-loader webpack 配置 module.exports = { module: { rul ...

  9. 016.Oracle数据库,取本季度第一天,取本季度最后一天

    /*取本季度第一天,取本季度最后一天*/ SELECT trunc(sysdate, 'Q') AS 本季度第一天 , add_months(trunc(sysdate, ) AS 本季度最后一天 F ...

  10. Java基础学习总结(一)——Java开发学习介绍

    Java平台: 1.J2SE java开发平台标准版 2.J2EE java开发费平台企业版 Java程序需要在虚拟机上才可以运行,换言之只要有虚拟机的系统都可以运行java程序.不同的系统上要安装对 ...