题目链接:点击查看
题目描述:
给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的 6174
,这个神奇的数字也叫 Kaprekar 常数。
输入输出:
输入
6767
输出
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
题目分析:
本题运用c++ sort(),to_string(),stoi()可以很方便的模拟出题目过程,要注意的是如果数字串不足四位的时候要在前面补零。详见如下代码。
代码:
#include<iostream>
#include<algorithm>
#include<functional>
#include<string>
#include<cstdlib>
#include<cstring>
using namespace std;
int main()
{
string n;
cin>>n;
n.insert(0, 4 - n.length(), '0');//不足四位要补零
do {
string n1=n,n2=n;
sort(n1.begin(),n1.end());
sort(n2.begin(),n2.end(),[](const char &a,const char &b){ return a>b; });
int res=stoi(n2)-stoi(n1);//stoi()函数可以将字符串转换为 int 范围内的整型 (另有atoi()函数)
n=to_string(res);
n.insert(0,4-n.length(),'0'); //不足四位在前面补零
cout<<n2<<" - "<<n1<<" = "<<n<<endl;
}while(n!="6174"&&n!="0000");
return 0;
}