蓝桥杯2014年第五届真题——拼接平方数(C/C++)
2021/10/16 17:39:36
本文主要是介绍蓝桥杯2014年第五届真题——拼接平方数(C/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; }
注:因水平有限,如有错误和需要改进完善之处,欢迎大家纠正指教,不胜感激。
这篇关于蓝桥杯2014年第五届真题——拼接平方数(C/C++)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26MATLAB 中 A(7)=[];什么意思?-icode9专业技术文章分享
- 2024-11-26UniApp 中如何实现使用输入法时保持页面列表不动的效果?-icode9专业技术文章分享
- 2024-11-26在 UniApp 中怎么实现输入法弹出时禁止页面向上滚动?-icode9专业技术文章分享
- 2024-11-26WebSocket是什么,怎么使用?-icode9专业技术文章分享
- 2024-11-26页面有多个ref 要动态传入怎么实现?-icode9专业技术文章分享
- 2024-11-26在 UniApp 中实现一个底部输入框的常见方法有哪些?-icode9专业技术文章分享
- 2024-11-26RocketMQ入门指南:搭建与使用全流程详解
- 2024-11-26RocketMQ入门教程:轻松搭建与使用指南
- 2024-11-26手写RocketMQ:从入门到实践的简单教程
- 2024-11-25【机器学习(二)】分类和回归任务-决策树(Decision Tree,DT)算法-Sentosa_DSML社区版