解题思路:
        

        因为Case数据有点大,建表不太好,一个个数判断平方数大概也会超时,我们选择一个巧妙的方法获取

区间内平方数,区间值开方 获取某一段数再逐个平方存起来 就达成目的了( 注意区间起始点要向上取整 ),然

后分割判断即可。大概也不是很难。


参考代码:

#include <iostream>
#include <cmath>
using namespace std;

	/*				获取区间平方数				*/
int find_Square(int start, int end, int squart[]) {
	int total = 0;
	for (int i = start; i <= end; i++)
		squart[total++] = i * i;
	return total;
}

	/*				判断区间平方数			   */
	/*		@param last 分割数字的后面部分		*/
	/*		@param part 分割位数所用的模数		*/
	/*		@param length 区间平方数的个数	*/
void splice_Square(int squart[], int length) {
	for (int i = 0; i < length; i++) {
		int part = 10, temp = squart[i], last;

		while (temp / part > 0) {
			last = temp % part;
			temp /= part;
			
			/*		取开方丢弃小数		*/
			int sqrt_last = (int)sqrt(last);
			int sqrt_temp = (int)sqrt(temp);

			/*		0 不被当作平方数	*/
			if (last != 0 && temp != 0 && sqrt_last*sqrt_last == last &&
				sqrt_temp*sqrt_temp == temp) {
				cout << squart[i] << endl;
				break;
			}
			
			/*	part*10 进一步分割	 */
			part *= 10;
			
			/*	重置平方数	*/
			temp = squart[i];
		}
	}
}

int main() {
	int start, end, square[1000];
	cin >> start >> end;
	int length = find_Square(ceil(sqrt(start)), sqrt(end), square);

	splice_Square(square, length);
	return 0;
}


点赞(4)
 

0.0分

5 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 3 条评论

学生小黑 3年前 回复TA
@dzm 奥在范围内,数岔劈了
学生小黑 3年前 回复TA
@dzm 251001超数据范围了 题目限定在10^6内
dzm 4年前 回复TA
有些好奇,361是拼接平方数,是因为能拆成36和1,为什么1936,拆成1和9和36,这样就不拼接平方数呢?题目好像没有限定只能拆成两部分吧,有些纳闷。251001这个也应该也算一个吧,25和100和1。