分拆素数和 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 28685 Accepted Submission(s): 12471 Problem Description 把一个偶数拆成两个不同素数的和,有几种拆法呢? Input 输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。 Output 对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。 Sample Input 30 26 0 Sample Output 3 2 Source 2007省赛集训队练习赛(2)
题是水题.....但是 就是写不成.总是超时..还是一些技巧不知道 下面附上原始的800ms
/* 和最初写的程序比较起来....这个 比较容易看懂 上一个自己就把自己写晕了 */ #include<stdio.h> int prime(int x); int main() { int n,i,j,m,a,b,c; while(scanf("%d",&n),n) { int jishu=0; for(i=2;i<n/2;i++) { j=n-i; if(prime(i)==1&&prime(j)==1) { jishu++; } } printf("%d ",jishu); } } int prime(int a) { int i,t=1; for(i=2;i<=a/2;i++)//将输入进来的数字 开始检查. { if(a%i==0) //在这里没有 加括号... { t=0; break; // 跳出去 } } return t; }
下面带上 200ms 直接缩小4倍时间的 代码并且 给出 改动的地方
/* 和最初写的程序比较起来....这个 比较容易看懂 上一个自己就把自己写晕了 */ #include<stdio.h> #include<math.h> int prime(int x); int main() { int n,i,j,m,a,b,c; while(scanf("%d",&n),n) { int jishu=0; for(i=2;i<n/2;i++) { j=n-i; if(prime(i)==1&&prime(j)==1) { jishu++; } } printf("%d ",jishu); } } int prime(int a) { int i,t=1; for(i=2;i<=sqar(a);i++)// 唯一改动的地方 (求是不是素数的时候开平方 这样 能减少 很多运算....时间就是乳沟一样 这里挤挤那里挤挤就有了....) { if(a%i==0) //在这里没有 加括号... { t=0; break; // 跳出去 } } return t; }