______________从时间超限到800ms 到200ms——————2098

分拆素数和
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;
    
}
原文地址:https://www.cnblogs.com/A-FM/p/5039774.html