Problem 9 : Special Pythagorean triplet

Problem 9


Special Pythagorean triplet

A Pythagorean triplet is a set of three natural numbers, a < b < c, for which,

a 2 + b 2 = c 2

For example, 32 + 42 = 9 + 16 = 25 = 52.

There exists exactly one Pythagorean triplet for which a + b + c = 1000.Find the product abc.


特殊毕达哥拉斯三元组

毕达哥拉斯三元组是三个自然数a < b < c组成的集合,并满足

a 2 + b 2 = c 2

例如,32 + 42 = 9 + 16 = 25 = 52

有且只有一个毕达哥拉斯三元组满足 a + b + c = 1000。求这个三元组的乘积abc。

题目解答

    朴素解法:暴力枚举
    优化算法:我们利用 素勾股数 的相关性质来构造合勾股数来解决这个问题。
    
   素勾股数

                性质 1. 他们整数倍也是勾股数,即(na, nb, nc)也是勾股数。

                性质 2. (a, b, c)之间两两互质。

                性质 3. a, b必为一奇一偶。

                性质 4. 任何素勾股数均可表示为如下形式, 其中 n < m, 且 gcd(n, m) = 1

                                a = 2 * n * m

                                b = m^2 - n^2

                                c  = m^2 + n^2 

题目代

#include <stdio.h>
#include <inttypes.h>
#include <stdlib.h>
#include <math.h>
int gcd(int a,int b){return !b?a:gcd(b,a%b);}
int main() {
    bool flag = true;
    int32_t a, b, c, e;
    for (int32_t i = 1; i < 32 && flag; ++i) {
        for (int32_t j = i + 1; j <= 32 && flag; ++j) {
            if((i % 2 == 0 && j % 2 !=0)||(i % 2 != 0 && j % 2 == 0)){
                if(gcd(i,j)!=1)continue;
                a = j * j - i * i;
                b = 2 * i * j;
                c = i * i + j * j;
                if (1000 % (a + b + c) == 0) {
                    e = (int32_t)pow(1000 / (a + b + c), 3);
                    printf("%d\n", e * a * b * c);
                    flag = false;
                }
            }
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Ruger008/article/details/80081832
今日推荐