【蓝桥杯】真题训练 2013年C++A组 题2 排它平方数

排它平方数 

题目标题:排它平方数
小明正看若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;
}

 

这题中,虽然还是暴力解法,直接解法算出来是不太可能的,那么这就利用了计算机计算的优势, 那么针对这种题,明确你的目标,按照思路一步一步去写,代码难度不会太高,总还是能得到结果的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值