*验证卡布列克运算。即:任意一个四位数,只要它们各个位上的数字是不全相同的,就有这样的规律:
(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
#include<stdio.h>
//排序常用的数组值的交换:
void swap_arr(int arr[], int a, int b)
{
int temp;
temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
//冒泡算法:打怪升级
void bubble_sort(int arr[], int n)
{
for (int i = 0; i < n; i++) //i每次冒泡的次数
{
for (int j = 0; j < n - 1; j++) //单次冒泡:前一个和后一个比较,直到结束
{
if (arr[j] > arr[j + 1]) //冒泡比较
{
swap_arr(arr, j, j + 1);
}
}
}
}
//验证卡布列克运算
int jj = 0;//计数器
int fun(int n, int* max, int* min)
{
//以下是获取四位数,作差的全部过程
int arr[4] = { 0 };
for (int i = 0; i < 4; i++)//这里固定运算4次,就不用考虑0的问题
{
arr[i] = n % 10;
n = n / 10;
}
bubble_sort(arr, 4);//从小到大排列,获得最小的数
int brr[4];
for (int i = 0; i < 4; i++) //获得最大的数
{
brr[i] = arr[3 - i];
}
*min = arr[0] * 1000 + arr[1] * 100 + arr[2] * 10 + arr[3];
*max = brr[0] * 1000 + brr[1] * 100 + brr[2] * 10 + brr[3];
int temp = *max - *min;//计算差值
printf(" [%d]:%d-%d=%d\n",++jj, *max, *min,temp);
//函数递归:
if (temp != 6174) //如果不等于最终的值,那么继续执行上面的过程
fun(temp, max, min);//继续执行下一步,直到等于6174为止
else
return 1;
}
int main()
{
int max, min,n;
int* Max=&max, * Min=&min;
printf("Enter number:");
scanf("%d", &n);
//调用函数
fun(n, Max, Min);
return 0;
}