求所有5位数的黑洞数


          任意一个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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值