寻找素数对
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1262
Problem Description
哥德巴赫猜想大家都知道一点吧.我们现在不是想证明这个结论,而是想在程序语言内部能够表示的数集中,任意取出一个偶数,来寻找两个素数,使得其和等于该偶数.
做好了这件实事,就能说明这个猜想是成立的.
由于可以有不同的素数对来表示同一个偶数,所以专门要求所寻找的素数对是两个值最相近的.
做好了这件实事,就能说明这个猜想是成立的.
由于可以有不同的素数对来表示同一个偶数,所以专门要求所寻找的素数对是两个值最相近的.
Input
输入中是一些偶整数M(5<M<=10000).
Output
对于每个偶数,输出两个彼此最接近的素数,其和等于该偶数.
Sample Input
20 30 40
Sample Output
7 13
13 17
17 23
code:
View Code
#include <iostream> #include <cmath> using namespace std; int prime[1300]; //开一个数组进行素数打表 int a[1000]; int main () { int cnt = 1; prime[0]=2; for (int i = 3; i < 10000; i=i+2) { int flag = 1; for (int j = 2; j <= sqrt(double(i)); j ++) { if (i % j == 0) { flag = 0; break; } } if(flag) prime[cnt++] = i; } //本段落是进行预处理.(打表) int x; int k = 0; while(cin >> x) //输入x { a[k++] = x; //用数组将输入的数值存储起来 } for(int i = 0; i < k; i ++) { int min = 20000; int px, py; int po = a[i] / 2; for(int j = 0; prime[j] <= po; j ++) //外层的是第一个数,打印出来的一定会比内层的小,所以一定是要小于等于输入的数据的,循环到数据的一半即可 { for(int l = j; prime[l] < a[i]; l ++) //内层寻找另一个数prime[py]; { if(prime[l] + prime[j] == a[i]) //判断是否满足条件, { if(prime[l] - prime[j] < min) //满足外层条件后,继续筛选,筛选出最大的两个满足条件的数 { min = prime[l] + prime[j]; px = j; py = l; } } if(prime[l] + prime[j] > a[i]) //这一个判断是必要的,可以节省很多的时间,如果两个数的和大于目标数,则内层循环就不必继续。break. break; } } cout << prime[px] << " " << prime[py] << endl; //输出. } return 0; }


浙公网安备 33010602011771号