题目描述
6174是一个神奇的数字,你将一个4位数n(只要这4位数码不完全一样)所有数码按升序和降序分别得到A和B,取n=B-A,如果n不为6174的话,继续迭代上面的过程,直到n为6174。 比如
no. n A B
0 1000 0001 1000
1 0999 0999 9990
2 8991 1899 9981
3 8082 0288 8820
4 8532 2358 8532
5 6174
请问需要迭代多少次才能达到6174?
输入
每行一个4位整数n,并且n的所有数码不完全相同。如果n=0表示输入结束,不需要处理。
输出
每行输出一个样例的结果。
样例输入
1000
6174
0
样例输出
5
0
这题可以先将n的每一位分别放进数组里,再进行排序,然后通过换算算出a与b,通过循环来计数即可解出。
#include <stdio.h>
char num[5]={0};
void swap(int a,int b)
{
int temp;
temp = num[a];
num[a] = num[b];
num[b] = temp;
}
void up()//1234
{
int i,j;
for(i = 0;i < 3;i++)
{
for(j = 0;j < 3-i;j++)
{
if(num[j]>num[j+1])
swap(j,j+1);
}
}
}
void down()//4321
{
int i,j;
for(i = 0;i < 3;i++)
{
for(j = 0;j < 3-i;j++)
{
if(num[j]<num[j+1])
swap(j,j+1);
}
}
}
int main()
{
int n,a,b,i;
while(scanf("%d",&n)!=EOF&&n!=0)
{
for(i = 0;n!=6174;i++)
{
num[0] = n/1000;
num[1] = n/100%10;
num[2] = n/10%10;
num[3] = n%10;
down();
b = (num[0]-48)*1000+(num[1]-48)*100+(num[2]-48)*10+num[3]-48;
up();
a = (num[0]-48)*1000+(num[1]-48)*100+(num[2]-48)*10+num[3]-48;
n = b - a;
}
printf("%d\n",i);
}
return 0;
}
后来我发现其实没必要升序与降序的函数都定义一个,这里只是一个从前往后与从后往前的区别。
|