回复 9楼 Devil_W
这道题 projetceuler 上好像有人发现相邻偶数值项的比例为黄金比例
回复 10楼 Devil_W
第三题的算法还可以优化
#include <stdio.h> #include <math.h> int prime[1024]; int primeNum = 0; //只能用于判断递增的数, 同时生成质数表 bool IsPrime(int x) { if (x == 2) { prime[primeNum++] = x; return true; } int idx = 0, n = (int)sqrt((float)x) + 1; for (; prime[idx] < n; idx++) { if (x % prime[idx] == 0) { return false; } } prime[primeNum++] = x; return true; } int main() { long long num = 600851475143; int idx = 2, ret = -1; for( ; idx <= num; idx++) { if (IsPrime(idx)) { while (num % idx == 0) // 可能有相同的质因子 { num /= idx; ret = idx; } } } printf("%d\n", ret); return 0; }
#include<stdio.h> #include<math.h> #define SQRT_5 2.2360679774997896964091736687313 #define A ((1 + SQRT_5) / 2) #define B ((1 - SQRT_5) / 2) int Test1(int n) //计算1-N以内(包括N)能被3和5整除的整数的和 { int i, a3, a5, a15; //n--;//如果不包括N请取消这行的注释 i = n / 3; a3 = (3 * (i + 1) * i) >> 1; i = n / 5; a5 = (5 * (i + 1) * i) >> 1; i = n / 15; a15 = (15 * (i + 1) * i) >> 1; return a3 + a5 - a15; } int Test2(int a) //计算小于等于a的fibonacci数列中的值为偶数的项的和 { double x, y, sf; int n, t; x = log(SQRT_5 * a) / log(A); x += 0.5; n = (int)x; y = (pow(A, n) - pow(B, n)) / SQRT_5; y += 0.5; t = (int)y; if(t > a) n--; sf = ((SQRT_5 + 1) / (SQRT_5 - 1) * (pow(A, n) - 1) - (1 - SQRT_5) / (1 + SQRT_5) * (1 - pow(B, n))) / SQRT_5; sf += 0.5; return ((int)sf) / 2; } int main() { printf("%d\n", Test1(1000)); printf("%d\n", Test2(4000000)); return 0; }