HzuWHF


私信TA

用户名:I7I08I9047

访问量:76347

签 名:

我RUN了

等  级
排  名 18
经  验 20440
参赛次数 13
文章发表 127
年  龄 3
在职情况 学生
学  校 贺州学院
专  业

  自我简介:

解题思路:
        

        因为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;
}


 

0.0分

5 人评分

  评论区

有些好奇,361是拼接平方数,是因为能拆成36和1,为什么1936,拆成1和9和36,这样就不拼接平方数呢?题目好像没有限定只能拆成两部分吧,有些纳闷。251001这个也应该也算一个吧,25和100和1。
2020-06-30 17:38:22
  • «
  • 1
  • »