Square Number
描述
给定正整数b,求最大的整数a,满足a*(a+b) 为完全平方数输入
多组数据,第一行T,表示数据数。对于每组数据,一行一个正整数表示b。
T <= 10^3, 1 <= b <= 10^9
输出
对于每组数据,输出最大的整数a,满足a*(a+b)为完全平方数
样例输入
3
1
3
6
样例输出
0
1
2
解题说明
这道题目是在参加笔试的时候碰到的一个题目,笔试的题目没有这么详细的描述,它的描述是:给定正整数b,求最大的整数a,满足a*(a+b) 为完全平方数。
最初看到这个题目的感觉是给定的条件这么少,不知道怎么入手。后来觉得这个题目核心是题中提到的表达式a*(a+b) 为完全平方数,这个表达式肯定要做相应的转换,才会有解决的办法。
因为我的解法大部分是数学的推导,下边用图片展示推导的过程:
在笔试时,记不得勾股数的计算公式,并且时间问题,只是描述算法到求勾股数的地方。
下面是具体的代码实现:
#include <iostream>
#include <stdint.h>
using namespace std;
uint64_t getMaxA(uint64_t b)
{
if (b < 3) return 0;
uint64_t square = b * b;
uint64_t c = 0;
uint64_t d = 0;
// 判断奇偶数
if((b&1) == 1) {
for(int i = 1; i < b; i++) {
if (square % i == 0) {
c = (square / i + i);
if ((c & 1) == 0) {
d = (c>>1) - b;
if((d&1) == 0) {
break;
}
}
}
}
}
else {
for (int i = 2; i < b; i += 2) {
if ((square>>1) % i == 0 && (square % i == 0)) {
c = (square / i + i);
if ((c & 1) == 0) {
d = (c>>1) - b;
if((d&1) == 0) {
break;
}
}
}
}
}
return d>>1;
}
int main(void)
{
int nums;
cin>>nums;
int c;
for(int i = 0; i < nums; i++) {
cin>>c;
cout<<getMaxA(c)<<endl;
}
}
在上面代码中,之所以采用64位无符号整数,是因为OJ上的测试用例中,b的取值是可能取到10的9次方。