Codeforce707 C. Pythagorean Triples

本文介绍了一种根据输入数字生成勾股数的算法。对于奇数输入,算法通过特定公式生成勾股数;对于偶数输入,则使用另一种方法生成勾股数。文中还提供了完整的C++实现代码。

链接http://codeforces.com/problemset/problem/707/C

思路
若输入为1,2 返回0

若输入为奇数
若需要一组最小数为奇数的勾股数,可任意选取一个 3 或以上的奇数,将该数自乘为平方数,除以 2,答案加减 0.5 可得到两个新的数字,这两个数字连同一开始选取的奇数,三者必定形成一组勾股数。但却不一定是以这个选取数字为起首勾股数的唯一可能,例如 (27, 364, 365) 并非是以 27 为起首的唯一勾股数,因为存在另一个勾股数是 (27, 36, 45),同样也以 27 为首.

若输入为偶数
以下的方法可用来找出勾股数。设 m > n 、 m 和 n 均是正整数,

a=m^2-n^2
b=2mn
c=m^2+n^2 

令n=1, m=b/2
a=m^2-1
b=m^2+1

#include<stdio.h>
#include<iostream>
#include<math.h>
#define ll long long
using namespace std;
int main(){
    ll n;
    cin>>n;
    if(n<=2){
        printf("-1\n");
        return 0;
    }


    if(n&1&&n>2){
        ll a=(n*n-1)/2;
        ll b=a+1;
        printf("%I64d %I64d\n",a,b);
    }
    else if(!(n&1)&&n>2)
    {
        n/=2;
        ll a=n*n-1;
        ll b=n*n+1;
        printf("%I64d %I64d\n",a,b);
    }

    return 0;

} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值