题目描述
任意一个每位数字不完全相同的 4 位正整数,将各位上数字重新组合成一个最大数和一个最小数相减,重复这个过程,必定得到 6174.
输入描述
有多组测试数据,每组测试数据占一行.
每行输入一个 44 位正整数.
输出描述
占一行,最终得到 61746174 的变换次数.
样例输入
Copy to Clipboard
1234
1000
6174
样例输出
Copy to Clipboard
3
5
0
头一次看到这个题目我是一脸蒙圈的状态啊,啥玩意,找规律吗?然后我就在纸上试着找了找规律,发现循环次数太多了,懒得继续算下去了,还是顺着题目的要求去实现对应的代码吧。
思路
- 这肯定要有一个循环结构,如果结果不是6174就继续循环,然后还要设置一个数来记录循环次数
- 数组总归不是一个数,所以重新排列组合的最大数和最小数肯定要设置成int型的max和min,还要设置一个差值final
- 因为需要计算的数一定是四位数,所以数组就设为a[4]好啦
- 把输入的整型数一个一个放到数组里面
- 然后设计一个函数把数组中的数字按照从小到大的顺序排序,设一个void insert(int a[],int num)来实现这个操作
代码实现
#include <stdio.h>
void insert(int a[], int num)
{
int i,j,temp;
for(i=0;i<num;i++)
for(j=i+1;j<num;j++)
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
int main() {
int n, count, final, s;
int a[4];
int max, min;
while(scanf("%d", &n)!=EOF)
{
count = 0; final = 0;
s = n;
while (final != 6174&&n!=6174) {
a[0] = s % 10;
a[1] = s / 10 % 10;
a[2] = s / 100 % 10;
a[3] = s / 1000;
insert(a, 4);
max = 1000 * a[3] + 100 * a[2] + 10 * a[1] + a[0];
min = 1000 * a[0] + 100 * a[1] + 10 * a[2] + a[3];
final = max - min;
count++;
s = final;
}
printf("%d\n",count);
}
return 0;
}
以上内容并非独立完成,有些步骤借鉴了网络