欧拉计划–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