【题意简述】:6174问题,就是输入一个四位数,将数字从大到小的排序结果,减去从小到大的排序结果,得到的结果再重复上述操作!直到得到的值是0,或者6174,便结束!(其中还有一些细小的叙述,参见题目。)
【思路】:没有难度,思路很好建立,最重要的是看懂题意,按照题意要求控制输入输出,我就栽在这里了,因为没有注意一定要输入四位,导致我一直OLE。
还有就是,在这里边有的语言知识就是sprintf,和printf不同之处就是printf是将内容输出至显示器,而sprintf是将内容输出到字符串中,sscanf同理,我就不再赘述,详细的可以看看语法书。
详见代码:
// 236K 0Ms
#include<iostream>
using namespace std;
#include<cstdio>
#include<cstring>
int a,b;
int get_next(int x) {
int 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);//将得到的结果转化为整型后储存在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() {
int n,t;
int count;
while(cin>>n)
{
if(n == -1) break;
count = 1;
cout<<"N="<<n<<":"<<endl;
if(n%1111 == 0||n>9999||n<1000) //!!注意这里输入必须是4位,否则就会 OLE!!
{
cout<<"No!!"<<endl;
continue;
}
for(;;) {
t = get_next(n);
cout<<a<<"-"<<b<<"="<<t<<endl;
if(t == 6174||t == 0)
{
cout<<"Ok!! "<<count<<" times"<<endl;
break;
}
count++;
n = t;
}
}
return 0;
}