生亦非生,死亦非死`
思路:
(1)用数组a[10]记录所给的四位数有哪几个数;
(2)向左扫描,求的大数
(3)向右扫描,求得小数
(4)循环
注意:第二个数和计算结果可能不够四位数,输出是要记得在前面补零
#include <stdio.h>
#define MAX 10
int N; /* 输入的正整数数N */
int a[MAX]; /* 将输入的数N按位分解,记录在相应的下表位置 */
int first_num; /* 储存第一个数,重组后,即递减的数 */
int second_num; /* 储存第二个数,重组后,即递增的数 */
void get_fs();
void print_fs();
/********************* 将N分解,装进a[],取的第一个数和第二个数 **************************/
void get_fs(){
int i, j;
int count;
first_num = second_num = 0; /* 先初始化,也是清空上一次结算的结果 */
for(i = 0; i < MAX; ++i)
a[i] = 0;
for(i = 0, j = 1000; i < 4; ++i){ /* 除四次,可得N的每一位上的数字 */
++a[N / j];
N %= j;
j /= 10;
}
for(i = MAX-1, j = 1000; i >=0; --i){ /* 从数组a[]的后面向前找, 求first_num */
for(count = a[i]; count != 0; --count){
first_num += i*j;
j /= 10;
}
}
for(i = 0, j = 1000; i < MAX; ++i){ /* 从数组前面向后找,求得second_num */
for(count = a[i]; count != 0; --count){
second_num += i*j;
j /= 10;
}
}
N = first_num - second_num;
}
/***************************** 输出第一数和第二个数 **************************************/
void print_fs(){
int i, j;
int count;
printf("%d - ", first_num);
if(second_num < 1000){ /* 第二个数首位有零 */
for(i = 0; i < MAX; ++i){
for(count = a[i]; count != 0; --count)
printf("%d", i);
}
}else
printf("%d", second_num);
printf(" = ");
if(N < 1000 && N > 100) /* N可能不足四位 */
printf("0");
printf("%d\n", N);
}
/******************************* 计算输出,直到6174 **************************************/
int main(){
scanf("%d", &N);
get_fs(); /* 取得第一次重新排序后的第一个和第二个数 */
if(N == 0)
printf("%d - %d = 0000", first_num, first_num); /* 输出N的四位数字全相同的情况 */
else{ /* 若N的四位数字不相同 */
print_fs(first_num, second_num); /* 输出 */
while(N != 6174){ /* 若还没有到6174 */
get_fs(first_num, second_num); /* 再计算第一个数和第二个数 */
print_fs(first_num, second_num); /* 再输出 */
}
}
}