#include<stdio.h>
int get_digit(int *instead);
int main(void)
{
int n;
int max,min,result;
int h,i, j,time;//控制循环次数
int save,cont,instead;//保存后续还要用的数
int count;//控制循环次数
int array_size = 3;//方便理解
int digits[3];
int sortead_digits[3];
max = min = result = 0;
scanf("%d", &n);
instead = n;
do
{
for (i = 0; i < (sizeof(sortead_digits) / sizeof(sortead_digits[0]));i++)//数组初始化
{
sortead_digits[i] = 0;
}
count = 0;
for (i = 0; instead != 0; i++) // 将n的各个位上的数拆分保存
{
digits[i] = get_digit(&instead);
count++;
}
sortead_digits[count - 1] = digits[0];
for (i = 1; i < count;i++)//插入排序算法,将n的各位置上的数重排
{
for (j = count - 1,time = 0; j >= (array_size - count) && time == 0;j--)
{
if (digits[i] > sortead_digits[j])//a数组与b数组中的数一一比较
{
save = sortead_digits[j];//保存好将要替换的b数组的数
sortead_digits[j] = digits[i];//将大于该b数组的单位替换
for (h = j - 1; h >= 0;h--)//将此b数组单位以前的单位往后移动一位
{
cont = sortead_digits[h];
sortead_digits[h] = save;
save = cont;
}
time = 1;
}
}
}
max = sortead_digits[array_size - 1] * 100 + sortead_digits[array_size - 2] * 10 + sortead_digits[array_size - 3];
min = sortead_digits[array_size - 3] * 100 + sortead_digits[array_size - 2] * 10 + sortead_digits[array_size - 1];
result = max - min;//求差
printf("%d - %d = %d\n", max, min, result);
instead = result;//不满足则进行下一轮重排求差
} while (result != 495);
}
int get_digit(int *instead)
{
int result;
result = *instead % 10;
*instead /= 10;
return result;
}
总结:
这个程序用到了前面的水仙花数中用于将n的各个位置上的数拆分保存的函数,所以建议大家在写程序的时候,重复用到的功能可以自定义一个函数去做,以后要用就可以直接复制粘贴,然后中间重排部分写了一个低级的插入排序的算法,程序的缺点是,有很多嵌套式的循环,对于理解很麻烦