Problem Description
把一个偶数拆成两个不同素数的和,有几种拆法呢?
Input
输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。
Output
对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。
Sample Input
30
26
0
Sample Output
3
2
2.思考:
一开始直接用传统做法去遍历素数,后来发现这样做当数字变得很大的时候可能会因为循环次数多而导致超时所以就去找简化的算法,想到了之前做过的有一题就是用到了这个算法:对输入的数n开根号,n只需被 2 到√n之间的每一个整数去除就可以了,能至少被一个数整除则n不为素数,否则n必定为素数。
原因:因为如果n 能被 2 ~ n-1 之间任一整数整除,其二个因子必定有一个小于或等于 √n,另一个大于或等于 √n。例如 16 能被 2、4、8 整除,16=2x8,2 小于 4,8 大于 4,16=4x4,4=√16,因此只需判定在 2~4 之间有无因子即可。
遇到的问题:一开始被拆分的意思误导了,把题目意思理解成在输入的数里找出它所有的因子然后再从得出的因子里面找出素数,后来发现不对劲,题目是拆分素数和,素数和应该是两个素数数的和加起来等于输入的数字n。
3.代码:
#include<stdio.h>
#include<math.h>
int sushu(int x){
int i;
for(i=2;i<=sqrt(x);i++){
if(x%i==0)return 0;
}
return 1;
}
int main(){
int i,n,count;
while(scanf("%d",&n)!=EOF){
if(n==0)break;
count=0;
for(i=2;i<=n/2;i++){
if(sushu(i)&&sushu(n-i))
count++;
if(i==n-i){
if(sushu(i)==1)count--;
}
}
printf("%d\n",count);
}
}
4.总结:快速、正确地理解题目意思很有必要,不然的话由于理解不正确做了一段时间后才发现逻辑、思路对不上答案,得不偿失。