#문제

#작성 코드

#include <iostream>
#include <stdio.h>
int main()
{
	int x, y, w, h;
	scanf("%d %d %d %d", &x, &y, &w, &h);
	printf("%d", ((x<y)?x:y)<((w-x<h-y)?w-x:h-y)?((x<y)?x:y):((w-x<h-y)?w-x:h-y));
	return 0;
} 

##

'BOJ' 카테고리의 다른 글

BOJ 4153번 :: 직각삼각형  (0) 2019.11.20
BOJ 3009번 :: 네번째 점  (0) 2019.11.19
BOJ 9020번 :: 골드바흐의 추측  (0) 2019.11.19
BOJ 4948번 :: Chebyshev's Theorem(베르트랑 공준)  (0) 2019.11.19
BOJ 1929번 :: 소수 구하기  (0) 2019.11.18

#문제

#작성 코드

#include <iostream>
#include <stdio.h>
using namespace std;
bool primeArr[10001];
// 어떤 수가 소수인지 아닌지 표시해 둔 배열(1: 소수) 
int primeNums[10001];
// 인덱스 0부터 소수들이 오름차순으로 들어있다.

void findPrime(){
	// 에라토스테네스의 체 알고리즘 이용
	// n이 최대로 가능한 10,000까지의 수에 대해 소수 구하기 
	fill_n(primeArr, 10001, 1);
	primeArr[0]=0;
	primeArr[1]=0;
	for(int i=2; i*i<10001; i++){
		if(primeArr[i]==0){
			continue;
		}
		for(int j=i+i; j<10001; j+=i){
			primeArr[j]=0;
		}
	}
} 

int checkPrime(){
	// 2이상의 소수들을 인덱스 0~cnt-1까지 오름차순으로 저장한다. 
	fill_n(primeNums, 10001, 0);
	int cnt=0;
	for(int i=2; i<10001; i++){
		if(primeArr[i]==1){
			primeNums[cnt++] = i;
		}
	}
	return cnt;
}
int main()
{
	int T, n;
	scanf("%d", &T);
	
	findPrime();
	int cnt = checkPrime();
	
	while(T--){
		scanf("%d", &n);
		if( n%2 != 0) return 0;			// 입력받은 n이 짝수가 아니면 종료. 
		int minus=10000, mini=0, minj=0;
		for(int i=0; i<cnt; i++){
			int x = n-primeNums[i];
			// x는 언제나 primeNums[i]보다 같거나 커야한다.(10은 5+5 케이스를 고려.) 
			if(primeArr[x]== 1 && x>=primeNums[i]){
				// 두 소수의 차가 가장 작은 케이스를 출력해야한다. 
				if( minus > x-primeNums[i]){
					minus = x-primeNums[i];
					mini=primeNums[i];
					minj=x;						
				}
			}
		}
		printf("%d %d\n", mini, minj);
	}
	return 0;
 } 

##

 

'BOJ' 카테고리의 다른 글

BOJ 3009번 :: 네번째 점  (0) 2019.11.19
BOJ 1085번 :: 직사각형에서 탈출  (0) 2019.11.19
BOJ 4948번 :: Chebyshev's Theorem(베르트랑 공준)  (0) 2019.11.19
BOJ 1929번 :: 소수 구하기  (0) 2019.11.18
BOJ 2581번 :: 소수  (0) 2019.11.18

#문제

#작성 코드

#include <iostream>
#include <stdio.h>
 
bool primeArr[123456*2+1];
int main()
{
	int n;
	while(1){
		scanf("%d", &n);
		if( n==0 ) break;
		// n보다 크고 2n보다 작거나 같은 소수의 개수를 구하자.
		std::fill_n(primeArr, 123456*2+1, true);	// 생성한 배열 true로 초기화 
		primeArr[0]=false;
		primeArr[1]=false;
		for(int i=2; i*i<=2*n; i++){
			// i가 소수가 아니면 pass! 
			if( primeArr[i] == false ){
				continue;
			}
			// i는 소수이므로 건너뛰고 i의 배수들이 소수가 아님을 표시 
			for(int j=i+i; j<=2*n; j+=i){
				primeArr[j] = false;
			}
		}
		
		// n보다 크고, 2n보다 작거나 같은 소수의 개수 출력 
		int cnt=0;
		for(int k=n+1; k<=2*n; k++){
			if(primeArr[k]==true){
				cnt++;
			}
		}
		printf("%d\n", cnt);
	}
	// n에 0이 입력될 때까지 계속 테스트케이스를 입력받는다. 
	return 0;
} 

##

처음에는 매 테스트케이스에서 n을 입력받을 때마다 bool primeArr배열을 동적으로 할당받는 식의 코드를 작성했었는데 dev c++에서는 제대로 동작했지만 boj에서는 틀렸습니다 판정을 받았다. 왜 그런거지?

결국 최대 n값인 123456까지를 저장할 수 있도록 전역변수로 bool primeArr[123456*2+1]을 선언해서 맞았습니다 판정을 받았다.

아래는 틀렸다고 판정받은 코드. primeArr배열의 선언 이외에는 모두 동일하다.

더보기
#include <iostream>
#include <stdio.h>

int main()
{
	int n;
	while(1){
		scanf("%d", &n);
		if( n==0 ) break;
		// n보다 크고 2n보다 작거나 같은 소수의 개수를 구하자.
		bool *primeArr = new bool[2*n+1];
		std::fill_n(primeArr, 123456*2+1, true);	// 생성한 배열 true로 초기화 
		primeArr[0]=false;
		primeArr[1]=false;
		for(int i=2; i*i<=2*n; i++){
			// i가 소수가 아니면 pass! 
			if( primeArr[i] == false ){
				continue;
			}
			// i는 소수이므로 건너뛰고 i의 배수들이 소수가 아님을 표시 
			for(int j=i+i; j<=2*n; j+=i){
				primeArr[j] = false;
			}
		}
		
		// n보다 크고, 2n보다 작거나 같은 소수의 개수 출력 
		int cnt=0;
		for(int k=n+1; k<=2*n; k++){
			if(primeArr[k]==true){
				cnt++;
			}
		}
		delete[] primeArr;
		printf("%d\n", cnt);
	}
	// n에 0이 입력될 때까지 계속 테스트케이스를 입력받는다. 
	return 0;
} 

 

'BOJ' 카테고리의 다른 글

BOJ 1085번 :: 직사각형에서 탈출  (0) 2019.11.19
BOJ 9020번 :: 골드바흐의 추측  (0) 2019.11.19
BOJ 1929번 :: 소수 구하기  (0) 2019.11.18
BOJ 2581번 :: 소수  (0) 2019.11.18
BOJ 1978번 :: 소수 찾기  (0) 2019.11.17

#문제

#작성 코드

#include <iostream>
#include <stdio.h>

bool primeArr[1000001];
// 1~1000000인덱스값 1이면 소수이다.
// 1,000,000정도의 수는 크기때문에
// 에라토스테네스의 체를 이용해보도록 하자. 

void prime(int m, int n){
	//primeArr의 값을 모두 1으로 초기화한다.
	std::fill_n(primeArr, 1000001, 1);
	// 1이 소수가 아님을 표시한다.
	primeArr[1] = 0;
	// 2부터 n의 제곱근까지 반복하며 에라토스테네스의 체 알고리즘 수행
	for(int q=2; q*q<=n; q++){
		if(primeArr[q] == 0){
			continue;
		}
		for(int k=q+q; k<=n; k+=q){
			primeArr[k]=0;
		}
	}	
}

int main()
{
	int M, N;
	std::cin>>M>>N;
	
	prime(M, N);
	
	//M과 N사이의 소수(primeArr[] == 1 ) 출력 
	for(int i=M; i<=N; i++){
		if(primeArr[i]==1){
			printf("%d\n", i);
		}
	} 
	return 0;
}

##

* std::fill_n(초기화 할 배열명, 초기화할 개수, 초기화값);

'BOJ' 카테고리의 다른 글

BOJ 9020번 :: 골드바흐의 추측  (0) 2019.11.19
BOJ 4948번 :: Chebyshev's Theorem(베르트랑 공준)  (0) 2019.11.19
BOJ 2581번 :: 소수  (0) 2019.11.18
BOJ 1978번 :: 소수 찾기  (0) 2019.11.17
BOJ 2775번 :: 부녀회장이 될테야  (0) 2019.11.17

#문제

 

#작성 코드

#include <iostream>
#include <stdio.h>
bool prime(int n){
	if( n<2 )
		return false;
	for(int i=2; i*i<=n; i++){
		if( n%i == 0 )
			return false;
	}
	return true;
}

int main()
{
	int M, N;
	std::cin>>M>>N;
	
	int sum=0, min=10001;
	for(int i=M; i<=N; i++){
		if(prime(i)){
			sum+=i;
			if(min>i)
				min = i;
		}
	}
	if( sum != 0 ){
		printf("%d\n%d", sum, min);
	}
	else{
		printf("-1");
	}
	return 0;
}

##

주어진 범위 내의 소수를 구해야 한다면 '에라토스테네스의 체'를 사용하는 것이 더 빠르지 않을까?!

 

'BOJ' 카테고리의 다른 글

BOJ 4948번 :: Chebyshev's Theorem(베르트랑 공준)  (0) 2019.11.19
BOJ 1929번 :: 소수 구하기  (0) 2019.11.18
BOJ 1978번 :: 소수 찾기  (0) 2019.11.17
BOJ 2775번 :: 부녀회장이 될테야  (0) 2019.11.17
BOJ 10250번 :: ACM 호텔  (0) 2019.11.17

#문제

#작성 코드

#include <iostream>
#include <stdio.h>

bool prime(int n){
	if( n<2 )
		return false;
	for(int i=2; i*i<=n; i++){
		if( n%i == 0 )
			return false;
	}
	return true;
}

int main()
{
	int N, cnt=0;
	// 수의 개수 입력 
	scanf("%d", &N);
	// N개만큼의 수 입력 
	int *arr = new int[N];
	for(int i=0; i<N; i++){
		std::cin>>arr[i];
	}
	
	// 소수 판별하기
	for(int i=0; i<N; i++){
		if(prime(arr[i]))
			cnt++;
	}
	printf("%d", cnt);
	return 0;
} 

##

2~sqrt(n) 범위 내에서 %연산을 통해 소수를 판별하면 2~n 범위에서 판별할때보다 계산량이 적어진다.

prime함수에서 n이 1일 경우를 빠트리지 않도록 주의!

'BOJ' 카테고리의 다른 글

BOJ 4948번 :: Chebyshev's Theorem(베르트랑 공준)  (0) 2019.11.19
BOJ 1929번 :: 소수 구하기  (0) 2019.11.18
BOJ 2581번 :: 소수  (0) 2019.11.18
BOJ 2775번 :: 부녀회장이 될테야  (0) 2019.11.17
BOJ 10250번 :: ACM 호텔  (0) 2019.11.17

+ Recent posts