출처 : 반크_반크 20년 백서
문제]
워링(Waring)의 소수 가설은 모든 홀수는 소수 또는 소수 세 개의 합이라고 주장하는 가설이다. 골드바흐(Goldbach)의 가설은 모든 짝수는 소수 두 개의 합이라고 주장하는 가설이다. 이 두 문제는 200년이 넘게 해결되지 않고 있다.
이 문제와 관련하여 조금 간단한 문제를 풀어보자. 주어진 정수를 정확하게 소수 네 개의 합으로 표현하는 방법을 찾아내자.
입력
한 줄에 하나씩의 정수 n(N<=10000000)이 입력된다. 입력은 파일 끝 문자에 의해 종료된다.
출력
각 입력 케이스 n에 대해 합해서 n이 되는 네 개의 소수를 출력한다. (한 줄에 한 케이스) 입력된 수가 소수 네 개의 합으로 표현될 수 없으면 "Impossible"이라고 출력한다. 답이 여러 가지 나올 수도 있는데, 그런 경우에는 아무 답이나 출력해도 된다.
입력 예
24
36
46
출력 예
3 11 3 7
3 7 13 13
11 11 17 7
출처]
Programming Challenges 알고리즘 트레이닝 북(한빛미디어)]
문제53 소수 네 개의 합(Summation of Four Primes) p198
참고풀이1]
#include <stdio.h>
int SoSu[10000000];
void SoSu_Ruslt(int NN)
{
int i,j;
SoSu[2]=1;
for(i=3;i<=NN;i+=2)
{
for(j=2;j<i;j++)
if(i%j==0) break;
if(j==i) SoSu[i]=1;
}
}
int main()
{
int N;
int cnt;//소수의 개수를 센다.
int Sum;//소수의 합을 구한다.
int nSo[4];//소수를 넣을 배열변수
int i,j,k,l;
while(scanf("%d",&N) != EOF)
{
if(N<=10000000)
{
SoSu_Ruslt(N);
cnt=0;
if(N>=8)
{
for(i=2;i<N;i++)
{
Sum=0;
if(SoSu[i]) nSo[0]=i;
for(j=2;j<N;j++)
{
if(SoSu[j]) nSo[1]=j;
for(k=2;k<N;k++)
{
if(SoSu[k]) nSo[2]=k;
for(l=2;l<N;l++)
{
if(SoSu[l]) nSo[3]=l;
if(N==(nSo[0]+nSo[1]+nSo[2]+nSo[3]))
{
for(j=0;j<4;j++) printf("%d ",nSo[j]);
printf("\n");
cnt=1;
break;
}
cnt=0;
}
if(cnt) break;
}
if(cnt) break;
}
if(cnt) break;
}
}
if(!cnt) printf("Impossible\n");
}
}
return 0;
}
참고풀이1 결과]
참고풀이2]
#include <stdio.h>
#include <math.h>
#define MaxN 10000000
static int N, Sum, Se[4];
int isPrime(int a) //소수여부를 체크
{
int i;
if(a<2) return 0;
for(i=2;i<=sqrt(a); i++)
if(a%i==0) return 0;
return 1;
}
//N이 8이상인 경우 언제나 해가 존재한다.
int PrimeSum(int a)
{
int i;
if(a<0)
{
if(Sum==N) return 1;
return 0;
}
for(i=N-Sum-2*a;i>=2; i--)
if(isPrime(i))
{
Se[a]=i;
Sum+=i;
if(PrimeSum(a-1)) return 1;
Sum-=i;
}
return 0;
}
int main()
{
int i;
while(scanf("%d",&N) != EOF)
{
Sum=0;
if(PrimeSum(3))
for(i=0;i<4;i++) printf("%d ",Se[i]);
else
printf("Impossible");
printf("\n");
}
return 0;
}
참고풀이2 결과]
대한민국의 아름다운 영토, 독도의 여름
'프로그램 > C언어 1000제' 카테고리의 다른 글
C언어 229제] 2003년 크로아티아 올림피아드 경진대회 고등부 Seniors 1번 금메달, 은메달, 동메달은 누가? (0) | 2025.02.17 |
---|---|
C언어 228제] NCP Lv3 수 정렬하기 2 (0) | 2025.02.17 |
C언어 227제] 팩토리얼 나누기(Factovisors) (0) | 2025.02.06 |
C언어 226제] 유크리드 문제(Euclid Problem) (0) | 2025.02.05 |
C언어 225제] NCP Lv3. 날짜계산 (0) | 2025.02.03 |
댓글