분리 소수 와 (온라인 작업)

제목 연결:http://acm.hdu.edu.cn/showproblem.php?pid=2098
소수 분할
Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 27221    Accepted Submission(s): 11915
Problem Description
하나의 우 수 를 두 개의 서로 다른 소수 의 합 으로 나 누 면 몇 가지 철거 법 이 있 습 니까?
 
 
Input
일부 정 수 를 포함 하 는 짝수 를 입력 하 십시오. 그 값 은 10000 을 초과 하지 않 고 개 수 는 500 을 초과 하지 않 으 며 0 을 만나면 끝 납 니 다.
 
 
Output
모든 짝수 에 대응 하여 출력 은 서로 다른 소수 로 나 누 어 지고 모든 결 과 는 한 줄 을 차지한다.
 
 
Sample Input
30 26 0
 
 
Sample Output
3 2
 
 
Source
2007 성 경기 합숙 훈련 팀 연습 경기 (2)
 
문제 풀이: 처음에 치 명 적 인 실 수 를 했 는데 이 문제 가 특별히 제시 한 데이터 범 위 를 잘 보지 못 했 습 니 다. 시 계 를 치면 반드시 시간 을 초과 할 수 있 기 때 문 입 니까?그래서 온라인 으로 조작 하면 됩 니 다. 체 법 으로 소 수 를 구하 세 요.
 1 #include<cstdio>
 2 #include<cstring>
 3 /*int IsPrime(int n)
 4 {
 5     int i;
 6     for (i=2; i<=sqrt(n); i++)
 7     {
 8         if (n % i == 0)
 9             return 0;
10     }
11     return 1;
12 }
13 */
14 #define N 10010
15 bool b[N];
16 void pri()
17 {
18     memset(b,0,sizeof(b));
19     for(int i = 2 ;i < N ;i++)
20     {
21         if(b[i]==0){
22             for(int j = i*i ; j < N ;j+=i)
23                 b[j] = 1;
24         }
25     }
26 }
27 int main()
28 {
29     int n, i, cnt;
30     pri();
31     while (scanf("%d", &n) && n)
32     {
33         cnt = 0;
34         for (i=3; i<n/2; i+=2)
35         {//          ,      n/2 ,   n/2 
36             if ( b[i]==0 && b[n-i]==0 )
37                 cnt++;
38         }
39         printf("%d
", cnt); 40 } 41 return 0; 42 }

좋은 웹페이지 즐겨찾기