【贪玩巴斯】带你刷题过蓝桥 —— 2013 年省赛A 真题 第二题:排他平方数 2021-12-20

【贪玩巴斯】带你刷题过蓝桥 —— 2013 年省赛A 真题 第二题:排他平方数 2021-12-20

  • 题目:
    • 题目二:排他平方数
    • C++ 源程序:
      • 解法一:枚举+筛选
      • 解法二:
    • 个人心得:
    • 涉及知识:

欢迎关注我的微信公众号:
编程之蓁

ID:
bianchengzhizhen
及时分享算法、计算机科学以及游戏编程内容

本人CSDN博客主页:
https://blog.csdn.net/D16100?spm=1000.2115.3001.5343
欢迎互相交流学习
————————————————

题目:

题目二:排他平方数

小明正看着 203879 这个数字发呆。

原来,203879 * 203879 = 41566646641

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

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

再归纳一下筛选要求:

  1. 6位正整数
  2. 每个数位上的数字不同
  3. 其平方数的每个数位不含原数字的任何组成数位

C++ 源程序:

解法一:枚举+筛选

/* 
排他平方数
小明正看着 203879 这个数字发呆。
原来,203879 * 203879 = 41566646641
这有什么神奇呢?仔细观察,203879 是个6位数,
并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。
具有这样特点的6位数还有一个,请你找出它!

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

#include
using namespace std;

int main(){
	
	for( int y = 1; y < 10; y++){
		for(int e = 0; e < 10; e++){
			if( y!= e )
				for(int san = 0; san < 10; san++){
					if( san != e && san != y)
						for(int si = 0; si < 10; si++){
							if( si != y && si != e && si != san)
								for(int w = 0; w < 10; w++){
									if( w != y && w!= e && w != san && w != si)
										for(int l = 0; l < 10; l++){
											if( l != y && l!= e && l != san && l != si && l != w){
												long long i =  y * 100000 +  e * 10000 + san * 1000 + si * 100 + w * 10 + l;
												long long z = i * i;
												
												while( z > 0){
													int j = z % 10;
													if( j == y || j == e || j == san || j == si || j == w || j == l){
														break;
													}
													
													z = z / 10;
											}
													
													
												if( (z % 10 == 0) && ((z/10) < 10)){
													cout << i * i << endl;
													cout << i <<endl;
												}
												}
												
												
											}
										}
										
								}
								
						}
				}
		}
	}
	

解法二:

#include
#include   // 要用这个库  不过dev C++ 好像并不支持这个库
using namespace std;


// 自己编写的函数 用于判断check 
bool check(long long i, long long ii){
	string str_i,str_ii;
	i2s(i, str_i);
	i2s(ii, str_ii);
	
	// 将两个进行循环比较 
	for(int x = 0; x < str_i.size(); x++){
		if(str_ii.find(str_i[x]) != string::npos)  // 没有找到相同的,判断语句菜不成立,才 不执行下面的 return 语句。
		return false;
	} 
	return true;
}


// 将longlong型数 变为字符串
void i2s(long long i, string &basic_string){
	stringstream ss;
	ss << i;
	ss >> basic_string;
}


int main(){
	
	for( int y = 1; y < 10; y++){
		for(int e = 0; e < 10; e++){
			if( y!= e )
				for(int san = 0; san < 10; san++){
					if( san != e && san != y)
						for(int si = 0; si < 10; si++){
							if( si != y && si != e && si != san)
								for(int w = 0; w < 10; w++){
									if( w != y && w!= e && w != san && w != si)
										for(int l = 0; l < 10; l++){
											if( l != y && l!= e && l != san && l != si && l != w){
												long long i =  y * 100000 +  e * 10000 + san * 1000 + si * 100 + w * 10 + l;
												long long z = i * i;
												
												// 自己编写一个函数
												if( check(i, z) ){
													cout << i << " " << i * i << endl;
												}
		
												}
												
												
											}
										}
										
								}
								
						}
				}
		}
	}

个人心得:

本题其实题目很简单,我们要做的就是读懂题目的意思,题目给了我们很多的判断条件。我们只需要拆分开来,一一枚举。再之后进行筛选。我才用的是一个经典简单的算法,即算出末尾来进行判断!

涉及知识:

  1. long long
    比int、long 类型更大

【贪玩巴斯】带你学:C++ tips ——知识点: C++整型short,int,long和long long的区别 2021年12月20日

  1. break 的用法
    直接跳出本次语句 往后执行

【贪玩巴斯】带你学:C++ tips ——知识点: continue、break、return的区别

  1. string::npos 讲解
    这里表示是否 find到值。 如果没有find到,就会返回string::npos

【贪玩巴斯】带你学:C++ tips ——知识点:string::npos 用法详细解析 , 看这一篇就够了 2021年12月21日

  1. find() 用法
    这里表示查找字符串。如果找到是返回对应的第一个下标。

【贪玩巴斯】C++ tips——知识点:find()函数 & find_first_of()函数 & 类似Java中的indexOf()函数

  1. stringstream

你可能感兴趣的