任意一个5位数
,比如:
34256
,把它的各位数字打乱,
重新排列
,可以得到一个最大的数:
65432
,一个最小的数
23456
。求这两个数字的差,得:
41976
,把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个 循环圈 。
请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。
循环圈的输出格式仿照:
[82962, 75933, 63954, 61974]
其中数字的先后顺序可以不考虑。
#include <iostream>
#include<Set>
#include<Vector>
#include<algorithm>
#include<Math.h>
#include<string>
#include<sstream>
using namespace std;
int GetNum(int num);//获取最大和最小之间的差
bool FindTheSame(vector<int> a,int ch,int ah,int& c);判断是否有循环圈存在,只需要判断是否有连续的两个数都相等即可判定其为黑洞循环
bool isAllDifferent(vector<int> a,int start,int end,vector<int> cp);//排除数字顺序不同而出现的情况
bool isNum=false;
int main(int argc, char** argv) {
set<string> a;//用来存储结果的集合
set<string>::iterator pos;
vector<int> check;//用来存储出现在结果中的所有数,以保证符合题目要求,不考虑数字出现的顺序(当然,这个可以根据用户使用需要自行更改了)
for(int n=10000;n<=99999;n++){
vector<int> result;
string str="[";
int Key;
int i=0;
int set;
Key=GetNum(n);
if(result.empty()){
result.push_back(Key);
Key=GetNum(Key);
i++;
}
while(!FindTheSame(result,Key,i,set)){
result.push_back(Key);
Key=GetNum(Key);
i++;
}
if(isAllDifferent(result,set,i-1,check)){
for(int q=set;q<i-1;q++){
check.push_back(result[q]);
stringstream ss;
string str1;
ss<<result[q];
str1=ss.str()+",";
str+=str1;
}//上一个FOR循环用来将结果转化为string类型存储到集合a里,使用集合可以减去我们手动判断的代码
str.replace(str.length()-1,1,"]");
a.insert(str);
}
}
for(pos=a.begin();pos!=a.end();++pos){
cout<<*pos<<endl;
}
return 0;
}
int GetNum(int num){
vector<int> start;
int temp;
int num1=0;
int num2=0;
if(num<10000)
isNum=true;
for(int i=0;i<5;i++){
if(isNum){
start.push_back(0);
isNum=false;
}else{
start.push_back(num%10);
num/=10;
}
}
sort(start.begin(),start.end());//使用STL内部的快排函数直接对向量排序
for(int i=0;i<5;i++){
num1+=start[4-i]*pow(10,4-i);
num2+=start[i]*pow(10,4-i);
}
temp=num1-num2;
return temp;
}
bool FindTheSame(vector<int> a,int ch,int ah,int& c){
for(int i=0;i<a.size();i++){
if(ch==a[i]){
if(i-1>=0){
if(a[i-1]==a[ah-1]){//只要有连续的两个数都相等即可判定其为黑洞循环
c=i-1;
return true;
}
}
}
}
return false;
}
bool isAllDifferent(vector<int> a,int start,int end,vector<int> cp){
for(int i=0;i<cp.size();i++){
for(int j=start;j<end;j++){
if(cp[i]==a[j])
return false;
}
}
return true;
}