PAT 乙级 1019 数字黑洞
思路:使用字符串保存数字,然后对字符串进行非递增排序和非递减排序,将字符串转化为数字,两数字相减得到新字符串,继续循环直到新字符串为6174或0000
注意:即使第一个数字就是6174也要循环,因为要求6174 作为差出现,因此必须要做一次循环,再进判断
// 1019 数字黑洞.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
bool cmp(char a, char b) {
return a > b;
}
int main()
{
//cout << __cplusplus << endl;
string s;
cin >> s;
s.insert(0, 4 - s.length(), '0'); //在0位置插入4-s.length()个字符'0'
do
{
string a = s, b = s;
sort(a.begin(), a.end(), cmp);
sort(b.begin(), b.end());
int temp = stoi(a) - stoi(b);
s = to_string(temp);
s.insert(0, 4 - s.length(), '0');
cout << a << " - " << b << " = " << s << endl;
} while (s != "6174" && s != "0000");
}
插入字符串,参考C++ string类insert用法总结 - 正在加载…… - 博客园 (cnblogs.com)
s.insert(0, 4 - s.length(), '0'); //在0位置插入4-s.length()个字符'0'
to_string:将数字转换成字符串(int、long、double)
字符串到数字的转换可以通过 stoX() 系列函数来执行。该系列函数的成员可以将字符串转换为 int、long、float 和 double 类型的数字。具体语法如下所示:
int stoi(const strings str, size_t* pos = 0, int base = 10)
long stol(const strings str, size_t* pos = 0, int base = 10)
float stof(const strings str, size_t* pos = 0)
double stod(const strings str, size_t* pos = 0)
例如,如果试图转换字符串 “-34iseven”,则将成功返回整数 -34,而无法转换的第一个字符的位置 pos 则被设置为 3。base 形参仅适用于整数转换,指示用于转换的进制。pos 和 base 形参都是可选的,所以它们可以被忽略。如果 pos 被忽略,则不会存储停止字符的索引。如果 base 被忽略,则默认为十进制。如果字符串 str 包含一个无效值,例如 “is-34 even?”,则不会进行转换,函数将抛出一个 invalid_argument 异常。
它们的头文件都是 #include< string >