알고리즘과 함께하는 C의 아름다움에 수록된 문제입니다.
Q. 2부터 100까지의 숫자 중에서 소수만을 골라서 배열에 저장하세요
#include <stdio.h>
int main() {
// bool을 사용하고 싶었지만 컴파일러 문제로 bool에 오류가 떠서 isSosu를 통해서 소수인지 아닌지를
// 구분했습니다.
int cnt = 0;
int isSosu = 1;
int pNs[25];
// 2 ~ 100까지의 값입니다.
for (int i = 2; i < 101; i++)
{
isSosu = 1;
// 소수란 1과 자신 외에 나눠지는 수가 없다는 뜻이기 때문에
for (int j = 2; j < i; j++)
{
// 자신 외에 나머지가 0일때 (나누어졌다는 뜻) isSosu에 0을 넣어서 flag 동작을 할 수 있도록 했습니다.
if ((i % j) == 0)
{
isSosu = 0;
break;
}
}
// 그래서 isSosu가 1인 경우는 1과 자신 외에 나눠지는 숫자가 없다는 뜻이기 때문에 배열에 추가하도록 했습니다.
if (isSosu == 1)
{
// cnt는 소수인 경우에만 증가하며 배열에 담길 소수의 위치를 의미합니다.
pNs[cnt] = i;
cnt++;
}
}
for (int i = 0; i < sizeof(pNs)/sizeof(int); i++)
{
printf("%d ", pNs[i]);
}
return 0;
}
Q. 정수 N에 포함된 숫자들을 재구성해서 만들 수 있는 가장 큰 숫자는 얼마입니까?
정수 : 192837465
출력 : 987654321
본인 풀이 : 이 문제를 풀기 위해 다음과 같이 생각했습니다
0. 정수를 입력 받는다(생략했습니다)
1. 정수를 배열에 담는다
2. 내부 비교를 통해서 정렬을 한다
3. 다시 정수로 변환한다.
#include <stdio.h>
#include <math.h>
int main(){
int N = 192837465;
int pNs[9];
int sum = 0, i = 0, tmp = 0;
// 정수를 배열에 담는 작업입니다.
// 1. 1의 자리부터 끝까지 배열에 담아줍니다.
// 그리고 i에는 N의 자릿수가 저장됩니다.
for ( i = 0; N > 0 ; i++)
{
pNs[i] = N % 10;
N = N/10;
}
// 2. 내부에서 정렬을 해줍니다. 내림차순으로 정렬을 해주었습니다.
for (int j = 0; j < i; j++)
{
for (int k = j+1; k < i; k++)
{
if (pNs[j] <= pNs[k])
{
tmp = pNs[j];
pNs[j] = pNs[k];
pNs[k] = tmp;
}
}
}
// 3. 배열을 다시 정수로 변환해줍니다.
for (int l = 0; l < sizeof(pNs)/sizeof(int); l++)
{
printf("제곱값 : %d\n", pNs[l]);
sum = sum + (pNs[l] * (int) pow(10.0, i-l));
}
printf("%d", sum);
return 0;
}
배열을 다시 정수로 변환하기 위해 여러가지 방법을 썼습니다.
사실 위와 같이 3번을 실행하면 이상한 숫자가 나옵니다. 아직도 왜 그런지는 알 수가 없습니다...
분명 9가 나와야하는데 겁나 큰 숫자가 나와서 저를 곤란하게 하고 있습니다.
해설은 3번을 atoi 함수를 사용해서 해결합니다. atoi 함수는 문자열을 정수로 변환하는 함수라고 합니다.
#include <stdlib.h> // atoi() 함수를 쓰기 위한 구문
nMax = atoi(pNs);
...네 끝입니다.
....하하 ㅋㅋㅋㅋㅋ
'IT > 자료구조 및 알고리즘' 카테고리의 다른 글
<자료구조와 알고리즘> 선형 배열 with Python (0) | 2023.02.17 |
---|---|
C 언어 <배열과 포인터> 관련 알고리즘 문제 (0) | 2023.02.02 |
기초 연습문제 5번 (0) | 2023.01.13 |
댓글