ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

蓝桥杯2014年第五届真题——拼接平方数(C/C++)

2021-10-16 17:32:40  阅读:161  来源: 互联网

标签:平方 数字 真题 int sqrt 蓝桥 拼接 C++ 开方


拼接平方数

一、题目内容 

题目描述 

小明发现49很有趣,首先,它是个平方数。它可以拆分为4和9,拆分出来的部分也是平方数。169也有这个性质,我们权且称它们为:拼接平方数。
    100可拆分1 00,这有点勉强,我们规定,0 00 000 等都不算平方数。
    小明想:还有哪些数字是这样的呢?
    你的任务出现了:找到某个区间的所有拼接平方数。

输入

 两个正整数  a b (a<b<10^6)

输出

 若干行,每行一个正整数。表示所有的区间[a,b]中的拼接平方数

样例输入

1 200

样例输出

49
169 

二、思路分析

        看完题目和样例,可以发现题目中蕴含了一个隐藏的条件,那就是拼接的数是由两段数字构成的,那么就可以通过拆分的方式分成两段数字进行操作。

判断思路:

1. 首先去除自身无法拆分的,即小于10的数。

2. 判断自身是否是平方数。

3. 拆分后的两段数字是否都是平方数。

        判断是否是平方数其中关键是判断开方后的数字是否是整数,这里提供一种方法:

floor(sqrt(n) + 0.5) != sqrt(n)

        floor()为向下取整函数,sqrt()为开方函数,一个数字开方后加上0.5后向下取整,如果等于其开方后的自己,则自己的开方数字为整数。这是一种无视类型直接求出需求的方法,此外这个方法还同样适用于一些判断计算结果是否有小数的计算。


三、代码实现

#include <bits/stdc++.h> //万能头文件
using namespace std;

int numberLength(int number) { //判断数字的位数
	int length = 1; 
	while (number /= 10) {
		++length;
	}
	return length;
}

int main() {
	int a, b;
	cin >> a >> b;
	for (int n = a; n <= b; n++) {
		if (n < 10) //无法拆分
			continue;
		if (floor(sqrt(n) + 0.5) != sqrt(n)) //自身开平方不是整数
			continue;
		int l, r; //l r 分别为拆分后的左右两部分数字
		int L = numberLength(n);
		while (L >= 2) {
			l = n / (pow(10, L - 1));
			r = n % (int)(pow(10, L - 1)); //注意强制转换为int,否则会报错
			if (l != 0 && r != 0 && floor(sqrt(l) + 0.5) == sqrt(l)
			        &&  floor(sqrt(r) + 0.5) == sqrt(r)) { //判断是否满足拼接平方数
				cout << n << endl;
				break;
			}
			L--;
		}
	}
	return 0;
}

注:因水平有限,如有错误和需要改进完善之处,欢迎大家纠正指教,不胜感激。


标签:平方,数字,真题,int,sqrt,蓝桥,拼接,C++,开方
来源: https://blog.csdn.net/Hello_world_n/article/details/120799394

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有