2020年7月5日第十一届蓝桥杯省赛真题C/C++ A组第一场
第五题:完美平方数
题目描述
如果整个整数X本身是完全平方数,同时它的每一位数字也都是完全平方数,我们就称X是完美平方数。 前几个完美平方数是
0、1、4、9、100、144… 请你计算第 2020 个完美平方数是多少?
思路
强行暴力,会超出数据范围。
要用大整数来运算。
运算时间爆炸。。
非暴力的方法还不知晓。
😭
代码
#include <cstdio>
#include <cstring>
struct bign{
int d[1000];
int len;
bign(){
memset(d,0,sizeof(d));
len=0;
}
}a,b;
bign add(bign &a, bign &b){
bign c;
int carry = 0;
for(int i=0; i<a.len||i<b.len; i++){
int temp = a.d[i]+b.d[i]+carry;
c.d[c.len++] = temp%10;
carry = temp/10;
}
if(carry){
c.d[c.len++] = carry;
}
return c;
}
bign multi(bign &a, int &b){
bign c;
int carry = 0;
for(int i=0; i<a.len; i++){
int temp = a.d[i]*b + carry;
c.d[c.len++] = temp%10;
carry = temp/10;
}
while(carry){
c.d[c.len++] = carry%10;
carry /= 10;
}
return c;
}
void print(bign &a){
for(int i=a.len-1; i>=0; i--){
printf("%d",a.d[i]);
}
printf("\n");
}
bool vis[10]={false};
bool judge(bign &c){
for(int i=0;i<=c.len-1; i++){
if(!vis[c.d[i]]) return false;
}
return true;
}
int main()
{
vis[0]=vis[1]=vis[4]=vis[9]=true;
b.d[0]=1,b.len=1;
a.d[0]=0,a.len=1;
int num=0;
for(int i=0; num<2020; i++){
bign c = multi(a,i);
if(judge(c)){
num++;
printf("%d:",num);
print(c);
}
a = add(a,b);
}
return 0;
}
longlong型版本(范围超出)
//#include <iostream>
//#include <cmath>
//using namespace std;
//typedef long long ll;
//int main()
//{
// bool vis[10]={false};
// vis[0]=vis[1]=vis[4]=vis[9]=true;
// int num=0;
// for(ll i=0;num<20;i++){
// ll temp = i*i;
// bool flag=true;
// while(temp){
// int last = temp%10;
// if(!vis[last]){
// flag=false;
// break;
// }
// temp/=10;
// }
// if(flag){
// num++;
//
// printf("%d:%lld\n",num,i*i);
//
// }
// }
// return 0;
//}