蓝桥杯题目练习 提高篇 平方十位数

平方十位数

题目描述

由0~9这10个数字不重复、不遗漏,可以组成很多10位数字。
这其中也有很多恰好是平方数(是某个数的平方)。
比如:1026753849,就是其中最小的一个平方数。
请你找出其中最大的一个平方数是多少?

输出

输出一个整数表示答案

答案

这道题其实非常简单,两种思路,一种是穷举10位大数,再开根号判断。
一种是穷举平方根,乘方后判断。

方法一: 穷举大数

#include <iostream>
#include <math.h>
using namespace std;
int num[11];
bool vis[10];
int sum;
int sum1,sum2,sum3;
long long n=99380,x,y,z;

void dfs(int index){
	if(index==11){
		x=0;
		for(int i=1;i<=10;i++){
			x=x*10+num[i];
		}
		if(x%2!=0) return;
		
		y=sqrt(x);
		if(y*y==x){
			cout<<x<<endl;
			exit(0);
		}
	}
	for(int i=9;i>=0;i--){
		if(!vis[i]){
			vis[i]=true;
			num[index]=i;
			dfs(index+1);
			vis[i]=false;
		}
	}
}

int main() {
	for(int i=0;i<10;i++){
		vis[i]=false;
	}
	dfs(1);
	return 0;
}

答案:9814072356

方法二: 穷举平方根

1026753849的平方根是32043,9876543210的平方根是99380。也就是平方根只会在32043到99380之间,我们只需穷举这些数,从大到小,乘方后满足条件的第一个数就是答案。

#include <iostream>
#include <math.h>
using namespace std;

bool pan(long long z){
	bool visz[11]={false,false,false,false,false
					,false,false,false,false,false,false};
	int q,flag=0;
	while(z!=0){
		q=z%10;
		if(!visz[q]){
			visz[q]=true;
			flag++;
		}
		else{
			return false;
		}
		z=z/10;
	}
	for(int i=0;i<11;i++){
		visz[i]=false;
	}
	return true;
}
int main() {
	for(int i=0;i<10;i++){
		vis[i]=false;
	}
	while(n>32043){
		x=n*n;
		//cout<<x<<' ';
		if(pan(x)){
			cout<<x<<endl;
			exit(0);
		}
		n--;
	}
	return 0;
}

答案:9814072356

发布了128 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Ace_bb/article/details/104738918