題目
給定任一個(gè)各位數(shù)字不完全相同的 4 位正整數(shù)粉捻,如果我們先把 4 個(gè)數(shù)字按非遞增排序,再按非遞減排序雪侥,然后用第 1 個(gè)數(shù)字減第 2 個(gè)數(shù)字碗殷,將得到一個(gè)新的數(shù)字。一直重復(fù)這樣做速缨,我們很快會(huì)停在有“數(shù)字黑洞”之稱的 6174锌妻,這個(gè)神奇的數(shù)字也叫 Kaprekar 常數(shù)。
例如旬牲,我們從6767開始仿粹,將得到
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
... ...
現(xiàn)給定任意 4 位正整數(shù),請(qǐng)編寫程序演示到達(dá)黑洞的過程原茅。
輸入格式
輸入給出一個(gè) (0,10000)區(qū)間內(nèi)的正整數(shù)N
輸出格式
如果 N 的 4 位數(shù)字全相等牍陌,則在一行內(nèi)輸出 N - N = 0000;否則將計(jì)算的每一步在一行內(nèi)輸出员咽,直到 6174 作為差出現(xiàn)毒涧,輸出格式見樣例。注意每個(gè)數(shù)字按 4 位數(shù)格式輸出。
?##輸入樣例 1:
6767
輸出樣例1
輸入樣例2
思路分析
①先輸入一個(gè)最多四位的正整數(shù)契讲,用int型保存仿吞。然后用兩個(gè)int型的數(shù)組num1和num2保存?zhèn)€位、十位捡偏、百位唤冈、千位的數(shù)值。
②分別用qsort()函數(shù)對(duì)兩個(gè)數(shù)組進(jìn)行排序银伟,一個(gè)遞增你虹,另一個(gè)遞減,然后還原成4位的整數(shù)彤避,進(jìn)行相減傅物,并打印結(jié)果。
注意:最后的結(jié)果輸出應(yīng)該輸出成"%04d"琉预。
代碼
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int cmp_up(const void *a,const void *b)
{
return *(int*)a-*(int*)b;
}
int cmp_down(const void *a,const void *b)
{
return *(int *)b-*(int *)a;
}
int main()
{
int n=0,number;
int num1[4]={0},num2[4]={0};
scanf("%d",&number);
if(number>9999) return 1;
int count=0,tmp_1=number;
while(tmp_1)
{
count++;
tmp_1 /=10;
}
tmp_1 = number;
for(int i=count-1;i>=0;i--)
{
int data = pow(10,i);
int j = tmp_1/data;
num1[i] =j;
tmp_1 = tmp_1 - j*data;
}
for(int i=0;i<4;i++)
num2[i]=num1[i];
if(num1[0]==0 && num1[1]==0&&num1[2]==0 && num1[3]==0)
return 1;
while(1)
{
int cnt=1,tmp;
qsort(num1,4,sizeof(int),cmp_down);
qsort(num2,4,sizeof(int),cmp_up);
int data1=num1[0]*1000+num1[1]*100+num1[2]*10+num1[3];
int data2=num2[0]*1000+num2[1]*100+num2[2]*10+num2[3];
int n=data1-data2;
tmp=n;
while(tmp/10)
{
cnt++;
tmp/=10;
}
tmp = n;
for(int i=cnt-1;i>=0;i--)
{
int data=pow(10,i);
num1[i]=tmp/data;
num2[i]=num1[i];
tmp = tmp-num1[i]*data;
}
printf("%04d - %04d = %04d\n",data1,data2,n);
if(n==6174||n==0) break;
}
return 0;
}