1019. 数字黑洞 (20)
原文链接: https://www.patest.cn/contests/pat-b-practise/1019思路:两个长度为4的字符数组,每次先用sort函数分别进行降序和升序排列,然后转换成整数进行计算,再将结果放回数组中,如此反复。
注意:1、输入不一定是4位数,若不足四位要在高位补 0 ; 2、每次计算结果也不一定是4位,所以也需在高位补 0
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
/* 思路:两个长度为4的字符数组,每次先用sort函数分别进行降序和升序排列,然后转换成整数进行计算,再将结果放回数组中,如此反复。
注意:1、输入不一定是4位数,若不足四位要在高位补 0 ; 2、每次计算结果也不一定是4位,所以也需在高位补 0
*/
char data[5]; //第一个数据
char d[5]; //第二个数据
int a,b; //保存两个整数
int result; //保存结果
bool desc(char a,char b){ //自定义降序排列,和sort函数一起使用
return a>b;
}
int main(){
int index=3; //表示数据第四位,从0开始,用于移动数据时使用
int len=0; //输入数据长度
scanf("%s",data);
len = strlen(data);
if(len<4){ //当输入小于4位数时,要在前面补 0
for(int i=len-1; i>=0; i--){ //将当前数据依次向后移
data[index]=data[i];
index--;
}
for(int j=0; j<4-len; j++){ //在前面空余处补 0
data[j]='0';
}
}
if(data[0]==data[1] && data[2]==data[3] && data[1]==data[2]){ //若为4位数相同
printf("%s - %s = 0000",data,data);
}else{
while(1){
strcpy(d,data); //复制字符数组
sort(d,d+strlen(d),desc); //对字符数组d进行降序排列,作为减数
a = (d[0]-'0')*1000 + (d[1]-'0')*100 + (d[2]-'0')*10 + (d[3]-'0');
sort(data,data+strlen(data)); //对字符数组data进行升序排列,作为被减数
b = (data[0]-'0')*1000 + (data[1]-'0')*100 + (data[2]-'0')*10 + (data[3]-'0');
result = a-b;
printf("%04d - %04d = %04d\n",a,b,result); // 04 为格式符,保留四位整数,若不足,高位补 0
if(result==6174){
break;
}
for(int i=3; i>=0; i--){ //每次结束后,再将结果一一放回字符数组中
data[i]=result%10+'0';
result/=10;
}
}
}
return 0;
}
原题:
1019. 数字黑洞 (20)
时间限制
100 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
给定任一个各位数字不完全相同的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位数格式输出。
输入样例1:6767输出样例1:
7766 - 6677 = 1089 9810 - 0189 = 9621 9621 - 1269 = 8352 8532 - 2358 = 6174输入样例2:
2222输出样例2:
2222 - 2222 = 0000