Euler 34
答案:40730
1 我用程序算了无数次都是145,蛋疼,最后拿别人的程序仔细对比…… 2 原来 0!=1…… 3 真蛋疼,我竟然连基础数学都忘了
Euler-44
根据公式容易得出:Pmin + Pj = Pk; Pj + Pk = Pmax。
遍历 Pmin 和 Pj,如果 Pmin + Pj 结果是 Pentagonal,那么 Pk = Pmin + Pj;继续算 Pk + Pj 的结果是否等于 Pentagonal 即可。
刚开始以 Pmin 为基准往后求解,算了十多分钟也没算出个结果,吃个饭静了下思路改成从 Pmax 为基准往前求解,秒出结果。
1 #include <stdio.h> 2 #include <math.h> 3 4 #define MAX_LEN 10000 5 6 int isPentagonal(int num) 7 { 8 int n = sqrt(num * 2.0 / 3 + 1.0/3); 9 if (3*n*n - n == num * 2) 10 return n; 11 n++; 12 if (3*n*n - n == num * 2) 13 return n; 14 return 0; 15 } 16 17 int main() 18 { 19 __int64 n, i, j, k; 20 __int64 Pentagonal[MAX_LEN]; 21 22 for (i = 1; i < MAX_LEN; i++) 23 { 24 Pentagonal[i] = (3*i*i-i)/2; 25 for (j = i-1; j > 0; j--) 26 { 27 n = isPentagonal(Pentagonal[i] - Pentagonal[j]); 28 if (n) 29 { 30 n = isPentagonal(Pentagonal[j] - Pentagonal[n]); 31 if (n) 32 { 33 printf("result=%d ", Pentagonal[n]); 34 break; 35 } 36 } 37 } 38 if (j) break; 39 } 40 return 0; 41 }
Euler-45
刚开始,直接算,算了一分钟还没出结果。。。
优化了下,秒出结果
1 int main() 2 { 3 DWORD next_tri = 40755; 4 DWORD ind_tri = 285; 5 DWORD next_pen = 40755; 6 DWORD ind_pen = 165; 7 DWORD next_hex = 40755; 8 DWORD ind_hex = 143; 9 while(1) 10 { 11 next_tri += ++ind_tri; 12 if (next_tri > next_pen) next_pen += (ind_pen++*3)+1; 13 if (next_tri > next_hex) next_hex += (ind_hex++ *4)+1; 14 15 if(next_tri == next_pen && next_tri == next_hex) 16 { 17 cout<<"solution: "<<next_tri<<endl; 18 return 0; 19 } 20 }
Euler-46
odd composite 其实是奇数&合数的意思
1 #include <stdio.h> 2 #include <math.h> 3 4 #define MAX_LEN 10000 5 6 int prime[MAX_LEN]; //0-素数, 1-非素数 7 int goldbach[MAX_LEN]; 8 9 int main() 10 { 11 int i, j, num; 12 for (i = 2; i < MAX_LEN; i++) 13 { 14 if (prime[i] == 0) 15 { 16 for (j = i + i; j< MAX_LEN; j+= i) 17 { 18 prime[j] = 1; 19 } 20 } 21 } 22 goldbach[1] = 1; 23 for (i = 1; i < MAX_LEN; i+= 2) 24 { 25 if (goldbach[i] == 0 && prime[i] == 1) //不满足i + j*j*2,且为合数 26 { 27 printf("result=%d ", i); 28 } 29 if (prime[i] == 0) 30 { 31 for (j = 1; j < sqrt(MAX_LEN); j ++) 32 { 33 num = i + j*j*2; 34 if (num < MAX_LEN) 35 { 36 goldbach[num] = 1; 37 } 38 } 39 } 40 } 41 return 0; 42 }
Euler-47
其实就是求每个数有多少个素数公约数
1 #include <stdio.h> 2 #include <math.h> 3 4 #define MAX_LEN 1000000 5 #define DISTINCT_COUNT 4 6 7 int isPrime[MAX_LEN]; //0-素数, 1-非素数 8 int num[MAX_LEN]; 9 10 int main() 11 { 12 int i, j, k, count; 13 for (i = 2; i < MAX_LEN; i++) 14 { 15 if (isPrime[i] == 0) 16 { 17 for (j = i + i; j < MAX_LEN; j+= i) 18 { 19 isPrime[j] = 1; 20 } 21 for (k = i; k < MAX_LEN; k+= i) 22 { 23 num[k] ++; 24 } 25 } 26 } 27 28 count = 0; 29 for (i = 2; i < MAX_LEN; i ++) 30 { 31 if (num[i] == DISTINCT_COUNT) 32 { 33 count ++; 34 if (count == DISTINCT_COUNT) 35 { 36 printf("result=%d", i - DISTINCT_COUNT + 1); 37 break; 38 } 39 } 40 else 41 { 42 count = 0; 43 } 44 } 45 46 return 0; 47 }
Euler-50
1 什么好说的,就是考阅读理解了。 2 求素数之和,要求连续的素数个数要是最多的,而且连续素数之和也是素数。
Euler-51
暴力解法,400秒,囧。
其实求出两个素数的相同处以后,把不同的位置上分别用0~9去算一遍应该更快,刚想到就出结果了,那也懒的再改了哈哈。
1 #include <stdio.h> 2 #include <math.h> 3 4 #define MAX_LEN 1000000 5 #define REPLACEMENTS_LEN 8 6 7 int isPrime[MAX_LEN]; //0-素数, 1-非素数 8 9 /**获取相同部分,相同部分用数字字符表示,不同部分用'.'表示, 注意结果是倒的*/ 10 char *getdiff(int i, int j) 11 { 12 static char diff[10] = ""; 13 int count = 0; 14 char diffchar = '