蓝桥杯2013c++A组真题&代码第二题排它平方数

蓝桥杯2013c++A组真题&代码第二题排它平方数

/*
题目标题: 排它平方数

    小明正看着 203879 这个数字发呆。

    原来,203879 * 203879 = 41566646641

    这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。

    具有这样特点的6位数还有一个,请你找出它!

    再归纳一下筛选要求:
    1. 6位正整数
    2. 每个数位上的数字不同
    3. 其平方数的每个数位不含原数字的任何组成数位

答案是一个6位的正整数。

请通过浏览器提交答案。
注意:只提交另一6位数,题中已经给出的这个不要提交。
注意:不要书写其它的内容(比如:说明性的文字)。*/


#include<iostream>
#include<cmath>
#include<cstring> 
using namespace std;
typedef long long ll;
bool num[10];
int A[6];

ll getnum(int *A){
	ll res=0;
	ll temp =1;
	for(int i=0;i<6;i++){
		res*=10;
		res+=A[i];
	}
	return res;
}

int dfs(int step,int *A,bool * num){
	if(step >= 6){
		ll res = getnum(A);
		ll res2 = res*res;
		while(res2){
			int k = res2%10;
			if(num[k]) return 0;
			res2/=10;
		}
		for(int i=0;i<6;i++){
			printf("%d",A[i]);
		}
		printf("\n");
		return 0;
	}
	for(int i=0;i<10;i++){
		if(!step && i == 0) continue;
		
		if(!num[i]){
			num[i] =1;
			A[step] = i;
			dfs( step+1, A, num);
			num[i] = 0;	
		}
	}
	return 0;
}
int main(){
	
	memset(A,0,sizeof(A));
	memset(num,0,sizeof(num));
	dfs(0,A,num);


	return 0;
} 

思路,主要是基于深度优先遍历的思想,对每种可能进行遍历,而不是6个循环,不过对应的,string 和 longlong 或者double 的相互转换,可以参考下面,这里逆着使用也是可以的

#include <sstream>
void i2s(long long x, string &basic_string) {
    stringstream ss;
    ss << x;
    ss >> basic_string;
}

猜你喜欢

转载自blog.csdn.net/Willen_/article/details/88362318