欧拉计划--C++编程突破5

欧拉计划–C++编程突破5

欧拉计划:https://projecteuler.net/problem=9

Problem 9

A Pythagorean triplet is a set of three natural numbers, a < b < c, for which,
a2 + b2 = c2 For example,32 + 42=9 + 16 = 25 = 52
There exists exactly one Pythagorean triplet for which a + b + c = 1000.
Find the product abc.

问题9
毕达哥拉斯三重态是由三个自然数组成的集合,a<b<c,其中,a2 + b
2 = c2 例如,32 + 42=9 + 16 = 25 = 52。 确切地存在一个毕达哥拉斯三重态,其中a + b + c=1000。 找到结果abc。

解题思路:本题解题思路主要是围绕素勾股数的性质,如果勾股数的三个数都互质,那么他们有以下性质:
1.他们的整数倍也是勾股数。2.他们两两也互质。3.a,b为1奇1偶。4.任意素勾股数可以表示为:a = 2 * n *m, b = m2 - n 2, c = m2 + n2. 证明上网自寻。

#include<stdio.h>
#include<math.h>

int gcd(int a, int b) {
    return (b ? gcd(b, a % b) : a);
}

int main() {
    int ans = 0;
    for (int n = 1; n < 33; n++) {
        for (int m = n + 1; m < 33; m++) {
            if (gcd(m, n) != 1) continue;
            int a = 2 * n * m;
            int b = m * m - n * n;
            int c = m * m + n * n;
            if (1000 % (a + b + c) == 0) {
                int k = 1000 / (a + b + c);
                ans = a * b * c * (int)pow(k, 3);  
            }
            if(ans) break;
        }
    }
    printf("%d\n",ans);
    return 0;
}

验证answer = 31875000

Problem 10

The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.
Find the sum of all the primes below two million.

问题10
低于10的素数之和为2,3,5,7=17。
找出两百万以下所有素数的总和。

解题思路:最简单的办法,判断素数,然后累加,可以使用素数表进行,如果使用前种方法,则时间消耗较大。

第一种方法:

#include <stdio.h>

int is_vaild(int n) {
    for(int i = 2; i < n ; i++) {
        if(n%i == 0) return false;
    }
    return true;
}

int main() {
    long long sum = 2;
    for(int i = 3; i < 2000000; i++) {
        if(is_vaild(i)) {
            sum += i;
        }
    }
    printf("%lld",sum);
    return 0;
}

第二种方法:

#include <stdio.h>
#include <inttypes.h>
#define max 10000000
int main() {
    int a, b;
    scanf("%d%d", &a, &b);
    int32_t prime[max + 5] = {0};
    for(int i = 2; i <= max; i++) {
        if(!prime[i]) {prime[++prime[0]] = i; if(i >= a && i <= b) printf("%d\n", i)}
        for (int j = 1; j <= prime[0]; j++) {
            if(i * prime[j] > max) break;
            prime[i * prime[j]] = 1;
            if(i % prime[j] == 0) break;
        }
    }
    return 0;
}

验证 answer = 142913828922

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值