【一只蒟蒻的刷题历程】 【PAT】 A1069 数字黑洞
发布日期:2021-05-04 19:23:09 浏览次数:14 分类:技术文章

本文共 3991 字,大约阅读时间需要 13 分钟。

For any 4-digit integer except the ones with all the digits being the same, if we sort the digits in non-increasing order first, and then in non-decreasing order, a new number can be obtained by taking the second number from the first one. Repeat in this manner we will soon end up at the number 6174 – the black hole of 4-digit numbers. This number is named Kaprekar Constant.

For example, start from 6767, we’ll get:

7766 - 6677 = 1089

9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
… …

Given any 4-digit number, you are supposed to illustrate the way it gets into the black hole.

Input Specification:

Each input file contains one test case which gives a positive integer N in the range (0,10​4​​).

Output Specification:

If all the 4 digits of N are the same, print in one line the equation N - N = 0000. Else print each step of calculation in a line until 6174 comes out as the difference. All the numbers must be printed as 4-digit numbers.

Sample Input 1:

6767

Sample Output 1:

7766 - 6677 = 1089

9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174

Sample Input 2:

2222

Sample Output 2:

2222 - 2222 = 0000


题目大意:

对于除了所有数字都相同的整数以外的任何4位整数,如果我们先按非升序对数字进行排序,然后再按非降序对数字进行排序,则可以通过从数字中取第二个数字来获得新数字。第一。以这种方式重复一次,我们很快就会结束于数字6174-4位数字的黑洞。该数字称为Kaprekar Constant。

例如,从6767开始,我们将获得:

7766-6677 = 1089

9810-0189 = 9621
9621-1269 = 8352
8532-2358 = 6174
7641-1467 = 6174
……

给定任何4位数字,您应该说明它进入黑洞的方式。

输入规格:

每个输入文件包含一个测试用例,该用例给出一个在(0,10 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


思路:

第一次发现 string 里居然可以用 sort 排序,神奇

代码1:

(希望以后会觉得这个代码也很垃圾。。)

#include 
using namespace std; void zhuan(string &a,string &b,string now) // 记录第一个数(要加&,才能加到本身),记录第二个数,没排序的数{
sort(now.begin(),now.end()); //字符串内从小到大排序 a = now; //记录该值 reverse(now.begin(),now.end()); //倒置 从大到小 b = now; //记录该值}string tostring(int x) //数字转string //这个pat每次用to_string都过不了,可能是我入场方式不对,手写一个{
string s; while(x) //数字转成string {
s += x%10+'0'; x/=10; } while(s.size()<4) //不够四位数,前面添加0 s = '0' + s; return s;}int main() {
int n; cin>>n; string s1,s2; zhuan(s1,s2,tostring(n)); int num1 = stoi(s1); //字符转数字 int num2 = stoi(s2); //相等直接输出 if(s1==s2) printf("%04d - %04d = 0000\n",num1,num2); else {
//因为num1是sort排序的,所以经过倒置的num2一定比num1大 while(num2 - num1 != 6174) //不断循环,直到6174出现 {
printf("%04d - %04d = %04d\n",num2,num1,num2-num1); zhuan(s1,s2,tostring(num2-num1)); num1 = stoi(s1); num2 = stoi(s2); } printf("%04d - %04d = %04d\n",num2,num1,num2-num1); } return 0;}

代码2(慎看):

想起这道题以前做过(当时只会c),看了一眼代码,直接裂开

#include 
#include
#include
void change1(char *a,int *x){
*x=0; *x+=(a[0]-'0')*1000; *x+=(a[1]-'0')*100; *x+=(a[2]-'0')*10; *x+=(a[3]-'0');}void change2(int *x,char *a){
a[0]='0'+*x/1000; a[1]='0'+*x/100%10; a[2]='0'+*x/10%10; a[3]='0'+*x%10;}void AList(char *a1,int *sum1){
char t; int i,j; for(i=1;i<4;i++) {
for(j=0;j<4-i;j++) {
if(a1[j]
a2[j+1]) {
t=a2[j]; a2[j]=a2[j+1]; a2[j+1]=t; } } } *sum2=0; *sum2=*sum2+(a2[0]-'0')*1000; *sum2=*sum2+(a2[1]-'0')*100; *sum2=*sum2+(a2[2]-'0')*10; *sum2=*sum2+(a2[3]-'0');}int main(){
char a[5],a1[5],a2[5]; int n,sum=0,sum1,sum2; scanf("%d",&n); change2(&n,a); if(a[0]==a[1]&&a[1]==a[2]&&a[2]==a[3]) {
printf("%s - %s = 0000\n",a,a); } else {
while(sum!=6174) {
strcpy(a1,a); strcpy(a2,a); AList(a1,&sum1); BList(a2,&sum2); sum=sum1-sum2; change2(&sum,a); printf("%s - %s = %s\n",a1,a2,a); } } return 0;}
上一篇:【一只蒟蒻的刷题历程】 【PAT】 A1070 月饼 (贪心)
下一篇:【一只蒟蒻的刷题历程】 【PAT】 A1030 旅行计划 (dijkstra+优先队列)

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2025年03月24日 15时27分51秒