题目描述
给定任一个各位数字不完全相同的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位数格
式输出。
输入示例
6767
输出示例
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
#include<stdio.h>
int main(){
int num;
scanf("%d",&num);
int Des[4],Asc[4];
int flag=0;
int br=0;//before result
int m1=0,m2=0,result;
while(flag==0){
int t=num%10;
if((num/t)==1111){
printf("%d - %d = 0000\n",num,num);
}
int i=0;
if(num>=100 && num<1000){
Des[i++]=0;
}else if(num>=10 && num<100){
Des[i++]=0;
Des[i++]=0;
}else if(num<10){
Des[i++]=0;
Des[i++]=0;
Des[i++]=0;
}
while(num!=0){
Des[i++]=num%10;
num /= 10;
}
int j;
for(i=0;i<4-1;i++){
for(j=1;j<4-i;j++){
if(Des[j]>Des[j-1]){
int temp=Des[j];
Des[j]=Des[j-1];
Des[j-1]=temp;
}
}
}
j=0;
for(i=3;i>=0;i--){
Asc[j++]=Des[i];
}
for(i=0;i<4;i++){
m1=Des[i]+m1*10;
m2=Asc[i]+m2*10;
}
result=m1-m2;
num=result;
if(result!=br){//这次的答案和上次的一样的时候,就意味着到6174了,不需要再打印这次
if(m2>=100 && m2<1000){//只有从小到大排序的数字才有可能出现第一位是0的情况
printf("%d - 0%d = %d\n",m1,m2,result);
}else if(m2>=10 && m2<100){
printf("%d - 00%d = %d\n",m1,m2,result);
}else if(m2<10){
printf("%d - 000%d = %d\n",m1,m2,result);
}else{
printf("%d - %d = %d\n",m1,m2,result);
}
br=result;
m1=m2=0;
}else{
flag=1;
}
}
return 0;
}