【3】蓝桥杯之排他平方数

问题描述:排它平方数

小明正看着 203879 这个数字发呆。
原来,203879 * 203879 = 41566646641

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

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

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

参考答案:639172

代码

//题目标题: 排它平方数
#include<iostream>
#include<climits>

using namespace std;
int main(){
	//cout<<"INT_MAX: "<<INT_MAX<<endl;
//	cout<<"long_MAX: "<<LONG_MAX<<endl;
//	cout<<"LLONG_MAX: "<<LLONG_MAX<<endl;
//	char s[6]; 
//注意除了a是从1开始,其他都是从0开始 
	for(int a=1;a<=9;a++)
		for(int b=0;b<=9;b++)
			for(int c=0;c<=9;c++)
				for(int d=0;d<=9;d++)
					for(int e=0;e<=9;e++)
						for(int f=0;f<=9;f++)
							{
								if(a!=b&&a!=c&&a!=d&&a!=e&&a!=f&&b!=c&&b!=d&&b!=e&&b!=f&&c!=d&&c!=e&&c!=f&&d!=e&&d!=f&&e!=f){
									bool flag = true; 
									long long num =a*100000+b*10000+c*1000+d*100+e*10+f;
//									long num =a*100000+b*10000+c*1000+d*100+e*10+f;
									long long sum = num*num;
									
//									cout<<"sum是啥 "<<sum<<endl;
									while(sum!=0){
										long x=sum%10;
										sum/=10;
										if(x==a||x==b||x==c||x==d||x==e||x==f)
										{
											flag = false;
//											break用处大,可以使其没用了早点跳出这个while循环 
											break;
										}
									}
									if(flag)
									{
//										这里的sum早就被前面改变了值,所以一直输出都是0 
										cout<<num<<"和"<<sum<<endl;
									} 
								}
							}
	return 0;
}

代码参考:https://blog.csdn.net/daoshen1314/article/details/103329817
以上代码完全就是暴力解法,但是因为是填空题所以可以这么愚蠢地做。暴力解法虽然简单,但也要有需要注意的地方!!不然简单都不会

  1. 用long long存储
  2. long num =a*100000+b*10000+c*1000+d*100+e*10+f; long long sum = num*num;这样子其实会把sum的long long类型转换为long类型了
  3. long long sum = 639172*639172;这样子还会把long long转换为int类型了,会溢出
  4. 将6位数先拆分6个位数的单个数进行计算,而不是从1一直计算到1000000
  5. 注意除了a是从1开始,其他都是从0开始,因为第一个数不能为0,其他数反而是不能忽略从0开始
  6. 求出sum之后,用while循环的求模,相除求出各个位数,判断是否有相同的地方则用if(x == a || x == b||x == c||x == d||x == e||x==f)
  7. 注意使用break和flag标志,有用处!

简化了一些

主要体现在check()函数,检查数字是否满足:其平方数的每个数位不含原数字的任何组成数位。主要涉及到stringstream和string的用法。

#include<iostream>
#include<climits>
#include<sstream>
//#include<string>
using namespace std;
bool check(long long x,long long xx){
	string s_x,s_xx;
	stringstream ss_x,ss_xx;
	ss_x<<x;
	ss_x>>s_x;
	
	ss_xx<<xx;
	ss_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(){
	//cout<<INT_MAX;//2147483647,INT_MAX跟LONG_MAX输出一样 
	//cout<<LLONG_MAX;//9223372036854775807
	for(int i=1;i<10;i++)
		for(int j =0;j<10;j++)
			{	
				if(i!=j){
					for(int k =0;k<10;k++)
						if(i!=k&&j!=k){
							for(int l =0;l<10;l++)
								if(i!=l&&j!=l&&k!=l){
									for(int m =0;m<10;m++)
										if(i!=m&&j!=m&&k!=m&&l!=m){
											for(int n =0;n<10;n++)
											{
												if(i!=n&&j!=n&&k!=n&&l!=n&&m!=n){
													long long x = i*100000+j*10000+k*1000+l*100+m*10+n;
													if(check(x,x*x))
													{
														cout<<x<<endl;
														cout<<x*x<<endl;
													}
												}
												
											}
										}
								}
							
						}
						
				}
				 
			}
	return 0;
} 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值