题目:假设你有一个各位数字互不相同的四位数,把所有数字从大到小排序后得到a,从小到大后得到b,然后a-b替换原来这个数,并且继续操作。输入一个n位数,输出操作序列,直到出现循环(即新得到的数曾经得到过)。输入保证循环之前最多只会产生1000个整数。
样例输入:1234
样例输出:1234->3087->8352->6174-6174
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int num[2000],count;
int get_next(int x)
{
int a,b,n;
char s[10];
//转换成字符串;
sprintf(s,"%d",x);
n=strlen(s);
//冒泡排序
for (int i=0; i<n; i++)
{
for (int j=i+1; j<n; j++)
{
if (s[i]>s[j])
{
char t=s[i];
s[i]=s[j];
s[j]=t;
}
}
}
sscanf(s,"%d",&b);
//字符串反转
for (int i=0; i<n/2; i++)
{
char t=s[i];
s[i]=s[n-1-i];
s[n-1-i]=t;
}
sscanf (s,"%d",&a);
return a-b;
}
int main()
{
cin>>num[0];
cout<<num[0];
for (count=1; ; count++)
{
num[count]=get_next(num[count-1]);
cout<<"->"<<num[count];
int found=0;
for (int i=0; i<count; i++)
{
if (num[i]==num[count])
{
found=1;
break;
}
}
if (found)
break;
}
cout<<endl;
return 0;
}
运行结果:
知识点总结:
这道题用了很久,我是先自己做的,main()大体和书上的差不多,但是get_next函数里面我自己用的是两个数组来记录原数组的从大到小和从小到大的排序。实在有些麻烦,最后也没有做出来。所以还是把书上的例子敲了一遍练练,学会了sprintf可以将数字转换为字符串,而sscanf则是将字符串转换并格式化数据。