蓝桥杯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;
}