任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。
比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。
请编写程序,输出一个5位数的循环圈,若5位数全都相同则循环圈为 [0]。循环圈的输出格式仿照:
[82962, 75933, 63954, 61974]
算法实现
void digitBlackHole(int n) {
int digit[5],loop[5],i,maxdigit,mindigit;
if (n%11111) { //判断五位数是否全部相同
for (i=0; i<5; i++) {
digit[0]=n/10000; //分别计算各数位数字
digit[1]=(n%10000)/1000;
digit[3]=(n%100-n%10)/10;
digit[2]=(n%1000-digit[3]*10-n%10)/100;
digit[4]=n%10;
quickSort(digit, 0, 4); //从小到大排序
maxdigit=digit[0]+digit[1]*10+digit[2]*100+digit[3]*1000+digit[4]*10000;
mindigit=digit[0]*10000+digit[1]*1000+digit[2]*100+digit[3]*10+digit[4];
loop[i]=maxdigit-mindigit; //取重排列最大差值
n=loop[i]; //循环求值
}
printf("[%d, %d, %d, %d]\n\n",loop[1],loop[2],loop[3],loop[4]); //首数非循环圈数值
} else {
printf("[0]\n\n"); //五位数相同输出[0]
}
}
void quickSort(int a[],int low,int high) { //快速排序
int mid=a[low],t,l=low,r=high;
if (low>=high) {
return;
}
while (low<high) {
if (a[high]<a[low]) {
t=a[high];
a[high]=a[low];
a[low]=t;
}
if (mid==a[low]) {
high--;
} else {
low++;
}
}
quickSort(a, l, low-1); //递归
quickSort(a, low+1, r);
}