HDU1262 寻找素数对
问题链接:HDU1262 寻找素数对
问题简述:参见上述链接。
问题分析:对于输入的偶数,先求得其一半的值,若不为奇数则减去1,然后从这个奇数开始从大到小用奇数试探。根据哥德巴赫猜想,一个偶数可以分解为两个素数之和,其中一个必然小于或等于这个偶数的一半。
有了上述的一个奇数p,对于输入的m来说,另外一个奇数就是m-p。
只要测试这两个奇数都是素数,就得到了差距最小的两个素数,输出即可。
程序说明:(略)。
AC的C语言程序如下:
/* HDU 1262 寻找素数对 */ #include <stdio.h> #include <math.h> int isprime(int n) { if(n == 3) return 1; int temp, i; temp = n % 6; if(temp != 1 && temp != 5) return 0; temp = sqrt(n); for(i=3; i<=temp; i+=2) if(n % i == 0) return 0; return 1; } int main(void) { int m, p; while(scanf("%d",&m)!=EOF) { p = m / 2; if(p % 2 == 0) p--; for(;;) { if(p <= 2) break; if(!isprime(p)) { p -= 2; continue; } if(isprime(m - p)) { printf("%d %d\n", p, m-p); break; } p -= 2; } } return 0; }