Square Number

本文介绍了一个算法,用于求解给定正整数b时,找到最大的整数a,使得a*(a+b)成为完全平方数。通过数学推导和代码实现展示了求解过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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次方。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值