我认为这是较为难的一道题,题目意思还是比较容易理解的。但是较为难处理
题目
看着的第一个想法就是将一个数字两次排序后相减得到的数字再次进行上述操作,直到出现数字黑洞“6174”,值得注意的是输入的四位数各位上数字都相等,那么直接输出.
在做题目时,要注意两个小地方,测试要求输入的N是0~1e4,所以输入的可能不是四位数,这个时候就要在处理字符串时在字符串前人工添上0补足四位。第二点是以防第一次输入的就是6174,所以要是有do while循环,不管怎么样,先进行一次循环,输出7641 – 6174 = 6174。
第一种,使用多种函数,思路,代码很简单,只要会使用函数就会。我们来看看需要使用那些函数。
insert函数
string &insert(int p0, const char *s);——在p0位置插入字符串s
string &insert(int p0, const char *s, int n);——在p0位置插入字符串s的前n个字符
string &insert(int p0,const string &s);——在p0位置插入字符串s
string &insert(int p0,const string &s, int pos, int n);——在p0位置插入字符串s从pos开始的连续n个字符
string &insert(int p0, int n, char c);——在p0处插入n个字符c
iterator insert(iterator it, char c);——在it处插入字符c,返回插入后迭代器的位置
void insert(iterator it, const_iterator first, const_iteratorlast);——在it处插入从first开始至last-1的所有字符
void insert(iterator it, int n, char c);——在it处插入n个字符c
很容易看出来insert就是一个插入的函数。上面的iterator就是迭代器,代表String的某个位置。一般,就写0,代表从开头插。而插入的东西插入的个数都由自己写进去参数。我们这里就需要从开头插入0,个数是补全四位数。
sort函数
sort函数的头两个参数,分别是排序的起始地址,结束地址。
本题对字符串全体排序,那么使用sort前,首先明确两个概念,一个是begin(),一个是end().
begin:得到数组头的指针
end:得到数组的最后一个单元+1的指针
那么sort函数对string进行排序就用到begin(),和end().
一般的:sort(s.begin(),s.end());
这是默认从小到大的排序
而当你想进行降序排序时,就要写一个cmp函数,
bool compare(int a,int b) { return a< b; //升序排列,如果改为return a>b,则为降序 }
。
stoi函数
作用非常的简单实用,把数字字符串转换成int输出,而且stoi()会非常贴心的做范围检查,默认范围是在int的范围内的,如果超出范围的话则会runtime error。当然要注意只能是字符串中的数字转化为int,其他字符九七四也没有需要转化为数字的需求吧。
to_string函数
这个函数和上面那个函数相反,他的作用是将整数转换为字符串表示形式。这也是一个简单好用的函数。
介绍完这些函数,代码就很简单了。
//数字黑洞之称的 6174
#include <cstring>
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
string s;
bool cmp(char a,char b){
return a > b;
}
int main(){
cin >> s;
s.insert(0, 4 - s.length(), '0');//不足四位,插0
do {
string a = s,b = s;
sort(a.begin(),a.end(),cmp);//从大到小排序
sort(b.begin(),b.end());//反过来
int res = stoi(a) - stoi(b);
s = to_string(res);
s.insert(0, 4 - s.length(), '0');//不足四位,插0
cout << a << " - " << b << " = " << s << endl;
} while (s != "6174" && s != "0000");
return 0;
}
复制代码
这是很简单的做法,还有其他不适用这么多函数或者使用char[]类型的代码,但是都不如这个简洁。
题目链接