验证卡布列克运算

验证卡布列克运算。即:任意一个四位数,只要它们各个位上的数字是不全相同的,就有这样的规律:

(1)将组成该四位数的四个数字由大到小排列,形成由这四个数字构成的最大的四位数;

(2)将组成该四位数的四个数字由小到大排列,形成由这四个数字构成的最小的四位数(如果四个数字中含有0,则得到的数不足四位);

(3)求两个数的差,得到一个新的四位数(高位零保留)。

重复以上过程,最后得到的结果总是6174。这个数被称为卡布列克常数。请编写一个递归函数,完成以上的卡布列克运算。

输入格式要求:”%d” 提示信息:”Enter number:”

输出格式要求:” [%d]:%d-%d=%d\n”

程序运行示例如下:

Enter number: 1234

【1】:4321-1234=3087

【2】:8730-378=8352

【3】:8532-2358=6174

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include<stdio.h>

int i,j;

void kabrack(int n,int cnt)
{
int a[4],min,max,temp;
//将各位数存进数组
for(i=0;i<4;i++)
{
a[i]=n%10;
n=n/10;
}
//将数组中数字从大到小排列
for(i=0;i<3;i++)
{
for(j=i+1;j<4;j++)
{
if(a[i]<a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
//计算排列四位数的最大之和最小值
max=1000*a[0]+100*a[1]+10*a[2]+a[3];
min=1000*a[3]+100*a[2]+10*a[1]+a[0];
n=max-min;
printf(" [%d]:%d-%d=%d\n",cnt,max,min,n);
//当结果为0时直接退出
if(n==0)
{
printf(" [%d]:%d-%d=%04d\n",cnt,max,min,n);
return;
}
//得到结果退出
if(n==6174)
return;
//没得到继续递归
kabrack(n,cnt+1);

}

int main()
{
int cnt=1,n;
printf("Enter number:");
scanf("%d",&n);
kabrack(n,cnt);
return 0;
}

基础的数组运用。