验证卡布列克运算。任意一个四位数,只要它们各个位上的数字是不全相同的,就有这样的规律:
1)将组成该四位数的四个数字由大到小排列,形成由这四个数字构成的最大的四位数;
2)将组成该四位数的四个数字由小到大排列,形成由这四个数字构成的最小的四位数(如果四个数中含有0,则得到的数不足四位);
3)求两个数的差,得到一个新的四位数(高位零保留)。
重复以上过程,最后得到的结果是6174,这个数被称为卡布列克数。
*问题分析与算法设计
题目中给出的处理过程很清楚,算法不需要特殊设计,可按照题目的叙述直接进行验证。
*程序说明与注释
#include <stdio.h>
void vr6174(int);
void parse_sort(int num, int *each);
void max_min(int *each, int *max, int *min);
void parse_sort(int num, int *each);
int count = 0;
int main()
{
int n;
printf("Enter a number:");
scanf("%d", &n);
vr6174(n);
return 0;
}
void vr6174(int num)
{
int each[4], max, min;
if (num != 6174 && num)
{
parse_sort(num, each);
max_min(each, &max, &min);
num = max - min;
printf("[%d]: %d - %d = %d\n", ++count, max, min, num);
vr6174(num);
}
}
void parse_sort(int num, int *each)
{
int i, *j, *k, temp;
for (i = 0; i <= 4; i++)
{
j = each + 3 - i;
*j = num % 10;
num /= 10;
}
for (i = 0; i < 3; i++)
for (j = each, k = each + 1; j < each + 3 - i; j++, k++)
if (*j > *k)
{
temp = *j;
*j = *k;
* k =temp;
}
}
void max_min(int *each, int *max, int *min)
{
int *i;
*min = 0;
for (i = each; i < each + 4; i++)
*min = *min*10 + *i;
*max = 0;
for (i = each + 3; i >= each; i--)
*max = *max*10 + *i;
}
1) Enter a number:4312
[1]:4312-1234=3078
[2]:8730-378=8352
[3]:8532-2358=6174
2) Enter a number:8720
[1]:8720-278=8442
[2]:8442-2448=5994
[3]:9954-4599=5355
[4]:5553-3555=1998
[5]:9981-1899=8082
[6]:8820-288=8523
[7]:8532-2358=6174
3)Enter a number:9643
[1]:9643-3469=6174