#문제

#작성 코드

#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

#문제

 

#작성 코드

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

int howmany(int k, int n){
	int sum=0;
	if( k == 0 ){
		return n;
	}
	for( int i=1; i<=n; i++){
		sum+= howmany(k-1, i);
	}
	return sum;
}
int main()
{
	int T;
	scanf("%d", &T);
	int k, n;
	while(T--){
		scanf("%d", &k);
		scanf("%d", &n);
		
		printf("%d\n", howmany(k, n));
	}	
	return 0;
}

##

 

'BOJ' 카테고리의 다른 글

BOJ 4948번 :: Chebyshev's Theorem(베르트랑 공준)  (0) 2019.11.19
BOJ 1929번 :: 소수 구하기  (0) 2019.11.18
BOJ 2581번 :: 소수  (0) 2019.11.18
BOJ 1978번 :: 소수 찾기  (0) 2019.11.17
BOJ 10250번 :: ACM 호텔  (0) 2019.11.17

#문제

 

#작성 코드

#include <iostream>
#include <stdio.h>
using namespace std;
int T;	// 테스트 케이스 개수 
int H, W, N;	// 층 수, 방 수, 손님no 
int roomNo;		// N번째 손님 배정받을 방 

int main()
{
	// 테스트케이스 개수 입력 
	scanf("%d", &T);
	while(T--){
		// 층 수, 방 수, 손님 번호 입력 
		scanf("%d %d %d", &H, &W, &N);
		roomNo = 0;
		int height, width;
		/* 30 50 30의 경우 3001호가 아닌
		102호에 묵는 문제를 해결하기 위해*/
		if( N%H == 0 ){
			height = H;
			width = N/H;
		}
		else{
			height = N%H;
			width = N/H+1;
		}
		roomNo += height*100+width;
		
		// N번째 손님에게 배정될 방 번호 출력
		cout<<roomNo<<'\n';
	}
	return 0;
}

##

처음에 roomNo = (N%H)*100 + N/H+1; 으로 했을때 30 50 30의 케이스에서 3001호가 아닌 102호에 묵는 문제가 발생해서

N%H == 0 의 경우를 따로 처리해주었다.

 

'BOJ' 카테고리의 다른 글

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

+ Recent posts