这一题要求我们对一个三位数进行循环操作,每一次循环中将其重排为六个不同的三位数,求出其中的极差,并打印出求差的过程,直到极差等于495时停止循环。
题目描述得很清晰,代码如下:
#include<stdio.h>
void sort(int* x, int* px) {//这个函数用来对输入的三位数x进行重排求差,*px为指向循环次数的指针
int a = *x / 100, b = (*x / 10) % 10, c = *x % 10;//a=x的百位数,b=x的十位数,c=x的个位数
int x1 = a * 100 + c * 10 + b, x2 = b * 100 + a * 10 + c, x3 = b * 100 + c * 10 + a, x4 = c * 100 + a * 10 + b, x5 = c * 100 + b * 10 + a;//这里直接枚举了三位数可能的排列
int A[] = { *x,x1,x2,x3,x4,x5 };//将其用数组存储
int max = A[0], min = A[0];//这里找出其中的最大值/最小值
for (int i = 1; i < 6; i++) {
if (A[i] > max) max = A[i];
if (A[i] < min) min = A[i];
}
int y = max - min;//求极差
*x = y;//这里将极差赋值给x,方便下一次循环
printf("%d: %d - %d = %d", (*px)++, max, min, y);
if (*x != 495) printf("\n");//当求出的极差不为495时,打印换行符
}
int main(void) {
int x;//读取一个三位数
scanf("%d", &x);
int i = 1;//循环次数
do{
sort(&x,&i);//选用do-while循环,是因为输入的数为495时也需要进行一次重排
}while(x!=495);
return 0;
}
在这里我们选择用指针来简化循环过程。指针的一个用处便是当函数返回值满足不了我们对于函数体外变量的修改时,可以选择传入指针给函数来达成目的。