蓝桥杯-2013省赛-排他平方数

蓝桥杯-2013省赛-排他平方数

题目描述
小明正看着 203879 这个数字发呆。

原来,203879 * 203879 = 41566646641

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

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

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

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

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

思路解析

知识点:

  1. int整型的范围:2147483647 ~ -2147473648

将数字各个数位分别存储到vector中,通过for循环一次判断每个六位整数是否各个数位相异,及自身的乘积是否含有自身的组成数字即可。

代码如下:

#include<iostream>
#include<vector>
#include "time.h"
using namespace std;

// 判断给定数位上的数字num是否包含于con
bool contain(vector<int> con, int num) {
	for (int i = 0; i < con.size(); i++) {
		if (con[i] == num) {
			return true;
		}
	}
	return false;
}

// 判断指定数字的每一个数位是否含有原数字的组成数字
bool is_in(long long int res, vector<int> con) {
	while (res) {
		int num = res % 10;
		res /= 10;
		if (contain(con, num))
			return true;
	}
	return false;
}

// 将原数字转换为容器,并用flag代表他是否为各个数位均相异
vector<int> get_vector(long long int num, int &flag) {
	vector<int> res;
	while (num) {
		if (contain(res, num % 10)) {
			num /= 10;
			flag = 0;
			return res;
		}
		res.push_back(num % 10);
		num /= 10;
	}
	return res;
}


int main() {
	for (long long int i = 100000; i < 1000000; i++) {
		if (i == 203879)
			continue;
		int flag = 1; // 代表数字是否为各个数位均相异,1表示均相异
		vector<int> con = get_vector(i, flag);
		if (!flag)
			continue;
		long long int res = i * i;
		if (!is_in(res, con)) {
			printf("%d\n", i);
			return 0;
		}
	}
}

答案为:639172

还是不够严谨,有些细节没有充分考虑,调试半天才看出来,需要多加练习**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值