계속 물 문 제 를 풀다 = | | 분해 소수 와 HDU 2098

2024 단어 ACMHDU

소수 와 소 수 를 나누다.
Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 24635    Accepted Submission(s): 10727
Problem Description
하나의 우 수 를 두 개의 서로 다른 소수 의 합 으로 나 누 면 몇 가지 철거 법 이 있 습 니까?
 
Input
일부 정 수 를 포함 하 는 짝수 를 입력 하 십시오. 그 값 은 10000 을 초과 하지 않 고 개 수 는 500 을 초과 하지 않 으 며 0 을 만나면 끝 납 니 다.
 
Output
모든 짝수 에 대응 하여 출력 은 서로 다른 소수 로 나 누 어 지고 모든 결 과 는 한 줄 을 차지한다.
 
Sample Input

   
   
   
   
30 26 0

 
Sample Output

   
   
   
   
3 2

 
Source
2007 성 경기 합숙 훈련 팀 연습 경기 (2)
나의 방법: 두 개의 배열 을 열 고 하 나 는 소수 인지 아 닌 지 를 표시 하 는 데 사용 합 니 다. 다른 하 나 는 소수 에 접근 하 는 데 사 용 됩 니 다. ----다른 소 수 를 계산 하 는 데 쓰 인 다
코드:
#include <iostream>
#include <cstring>
#include <stdlib.h>

using namespace std;

bool primelist[10001];//            false,  true      
int primes[5000];

int makePrimelist()
{
    int i,j;
    primelist[1]  = true;
    for(i = 4;i <= 10000;i+=2)
        primelist[i] = true;
    for(i = 3;i <= 100;i+=2)
    {
        if(!primelist[i])
            for(j = i*i;j <=10000;j+=i)
            primelist[j] = true;
    }
    j = 0;
    for(i = 1;i <= 10000; i++)
        if(!primelist[i])
        primes[j++] = i;
    return j;
}
int main()
{
    int n,len,i;
    int flag;
    len = makePrimelist();
    //for(i = 0;i <len;i++)
        //cout << primes[i] << endl;//    

    while(cin >> n && n)
    {
        flag = 0;
        for(i = 0;i < len;i++)
            if(n - primes[i] > 0 && !primelist[n-primes[i]]) flag++;//  n      ,   (n-    )     ,        
        cout << flag/2 << endl;
    }
    return 0;
}




좋은 웹페이지 즐겨찾기