排它平方数
题目标题:排它平方数
小明正看若203879 这个数字发呆。
原来,203879 * 203879 = 41566646641
这有什么神奇呢?仔细观察,203879
是个6位数,并且它的每个数位上的数字都是不同的,井且它平方后的所有数位上都不出现组成它自身的数字。
具有这样特点的6位数还有一个,请你找出它!
答案:639172
题目解析
暴力枚举
暴力枚举法,分别对六位数进行循环组成,按照条件,六位数每位数都不同,并且最后平方得到的数不包含自身数字,那么对这一条件进行check 检查一下。
需要注意的是,两个六位数相乘得到的数很大,超过了int的范围,因此最好用 long long 大数来存储以避免出错。以后遇到类似会出现大数的问题,用 long long 会安全一点,这也是对数值范围的判断
这里面用到了一个好用的函数,将整数转换成字符串
#include <iostream>
#include <sstream>
using namespace std;
//t2:排它平方数
//整数转成字符串
void i2s(long long x, string &basic_string){
stringstream ss;
ss << x;
ss >> basic_string;
}
//判断xx是否包含x中的数字
bool check(long long x, long long xx){
string s_x, s_xx;
i2s(x, s_x);
i2s(xx, s_xx);
for(int i = 0; i < s_x.length(); i++){
if(s_xx.find(s_x[i]) != string::npos){
return false;
}
}
return true;
}
int main(int argc, char** argv) {
for(int i = 1; i < 10; i++){
for(int j = 0; j < 10; j ++){
if(j != i){
for(int k = 0; k < 10; k++){
if(k != i && k != j){
for(int l = 0; l < 10; l ++){
if(l != i && l != j && l != k){
for(int h = 0; h < 10; h ++){
if( h != i && h != j && h != k && h != l){
for(int m = 0; m < 10; m ++){
if( m != h && m != i && m != j && m != k && m != l){
long long num = i*100000 + j*10000 + k*1000 + l*100 + h*10 + m;
if(check(num, num*num)){
cout << num << " " << num*num << endl;:
}
}
}
}
}
}}
}
}
}
}
}
return 0;
}
这题中,虽然还是暴力解法,直接解法算出来是不太可能的,那么这就利用了计算机计算的优势, 那么针对这种题,明确你的目标,按照思路一步一步去写,代码难度不会太高,总还是能得到结果的。