[蓝桥杯][2014年第五届真题]拼接平方数

这篇博客介绍了一种使用C++编程解决寻找指定范围内拼接成平方数的整数的方法。通过预计算1e3以内的平方数并存储在映射中,然后检查目标范围内的每个数是否能被分割成两个平方数。代码实现中使用了位操作和映射数据结构来优化搜索过程。
摘要由CSDN通过智能技术生成

题目链接:拼接平方数



解题思路:因为数据范围1e6,所有只需要先把1e3内的平方数求出来,然后再检查a~b的每一个数。从最后一位数开始把当前数分割,如果不合法,就从最后两位数开始分割,直到整个数分割完后,还是不合法那就不合法。

#include<bits/stdc++.h>
#define x first
#define y second
#define mem(h) memset(h,-1,sizeof h)
#define mcp(a,b) memcpy(a,b,sizeof b)
using namespace std;
typedef long long LL;
typedef unsigned long long ull; 
typedef pair<int,int>PII;
typedef pair<double,double>PDD;
namespace IO{
	inline LL read(){
		LL o=0,f=1;char c=getchar();
		while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
		while(c>='0'&&c<='9'){o=o*10+c-'0';c=getchar();}
		return o*f;
	}
}using namespace IO;
//#############以上是自定义技巧(可忽略)########## 
const int N=1e3+7,M=2e5+7,INF=0x3f3f3f3f,mod=1e9+7,P=131;
map<int,bool>st;
int a,b;
bool check(int num){
	int k=10;//从最后一位开始分割
	while(num/k){//直到整个数分割完
		if(st[num%k]&&st[num/k])return true;//分割的位置前部分和后部分都要满足是平方数
		k*=10;//分割位置往前推一位
	}
	return false;
}
int main(){
	cin>>a>>b;
	for(int i=1;i<N;i++)st[i*i]=1;//把这个平方数标记
	for(int i=a;i<=b;i++){
		if(st[i]){//如果这个数是平方数
			if(check(i)){//检查这个数
				cout<<i<<endl;
			}
		}
	}
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值