문제 1.
다음과 같이 2 ~ 100 까지 수 중에서 솟수(1과 자기 자신 외에 약수가 없는 수)를 모두 출력하고, 그 소수들의 합을 구하는 프로그램을 작성하시오. 솟수인지 아닌지 판단하는 함수 isPrime(int n)을 작성해서 이용할 것. isPrime(int n) 는 n이 솟수이면 1, 솟수가 아니면 0을 return 한다.
소수 판정에 관한 문제. 에라토스테네스의 체 등, 여러가지 효율적인 알고리즘이 존재하지만, 여기서는 그냥 나누는 방법을 써보자. 소수는 1과 자기 자신만을 약수로 가지는 수이므로, 2부터 나누어 보면서 나누어 떨어지면 0을 반환한다.
기본적으로는 2 ~ n까지 나누어 보면서 검사하지만, 사실은 sqrt(n)까지만 나누어도 충분하다. n = ab라고 한다면, n이 정해져 있기 때문에 a와 b 둘중 하나가 결정되면 남은 하나는 자동적으로 결정된다. 따라서 a(또는 b)가 sqrt(n)을 넘어선다면, a와 b가 바뀔 뿐, 나눴던 행위를 다시 하는 셈이기 때문이다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int isPrime(int n) // 솟수 검사 함수, 솟수이면 1 아니면 0을 return
{
if (n == 1)
return 0;
else {
for (int i = 2; i * i <= n; i++) {
if (n % i == 0)
return 0;
}
}
return 1;
}
void main() // 2 ~ 100 소수 찾아서 출력하고 더하기
{
int i, sum = 0;
for (i = 2; i <= 100; i++) {
// isPrime()을 이용해서 솟수이면 출력하고 sum 에 더한다.
if (isPrime(i)) {
printf("%d ", i);
sum += i;
}
}
printf("\n");
printf("sum=%d\n", sum);
}
문제 2.
완전수란 어떤 정수의 약수를 모두 더했을 때 자기 자신과 같은 수를 말한다. 예를 들어 6의 약수 1, 2, 3을 더하면 6으로 정수 자신이 되는 수이다. 다음 화면과 같이 2 ~ 10,000 사이의 수 중에서 완전수를 구해서 출력하는 프로그램을 작성하시오.
// Lab02-2 완전수 구하기
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void main()
{
int n, i, j, sum;
int ndiv, div[5000]; // 약수 보관 장소
n = 10000;
for (i = 2; i <= n; i++) {
sum = 0; //
ndiv = 0; // 약수의 갯수를 초기화 한다.
// 2 ~ i/2 수 중에서 i의 약수를 구해서 sum 에 더하고 div[]에 저장한다
for (j = 1; j <= i / 2; j++) {
if (i % j == 0) {
sum += j;
div[ndiv++] = j;
}
}
// i == sum 이면 완전수 이므로 i와 div[]를 6 = 1 + 2 + 3 식으로 출력한다.
if (i == sum) {
printf("%d = ", i);
for (j = 0; j < ndiv; j++) {
printf(j == ndiv - 1 ? "%d \n" : "%d + ", div[j]);
}
}
}
}
문제 3.
매클로린 급수에 관한 문제. e^x의 급수식 자체를 구현하는 게 아니라 x/n에서 n을 계속 증가시키면서 항에 곱하고, 그 값을 더한다.
// Lab02-3 exp(e, x) 구하기
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
double myexp(int x) // 매클로린 급수
{
int n;
double term, sum, oldsum;
oldsum = 0.0;
sum = 1.0;
term = 1.0;
// for n=1 term > 0.0000001 일 때 까지
// n를 증가시키면서
for (n = 1; term > 0.0000001; n++) {
// term = 을 구한다.
// sum = sum + term 으로 누적 값을 구한다.
term *= ((double)x / n);
sum += term;
}
return sum;
}
void main()
{
int i;
printf(" exp() : ");
for (i = 1; i <= 5; i++)
printf("%lf ", exp((double)i));
printf("\n");
printf("myexp() : ");
for (i = 1; i <= 5; i++)
printf("%lf ", myexp(i));
printf("\n");
}
문제 4.
파일을 이용한 입/출력 처리. 두 정수를 입력받아 합과 곱을 출력하는 프로그램을 입력은 input.txt, 츨력은 output.txt 를 이용하여 처리. (입력/출력이 1 set 인 경우)
문제만 들어보면 파일 입출력에 관한 문제인 것 같지만, 사실은 I/O redirection을 배우기 위한 문제. 사실 문제도 아니긴 하다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void main()
{
int x, y;
scanf("%d %d", &x, &y);
printf("%d %d\n", x+y, x*y);
}
문제 5.
파일 입출력(I/O redirection)을 통해 두수의 합, 곱을 출력한다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void main()
{
int i, T, x, y;
scanf("%d", &T);
for (i = 0; i < T; i++) {
scanf("%d %d", &x, &y);
printf("%d %d\n", x + y, x * y);
}
}
문제 6.
정수 배열을 입력받아 총점, 최대값, 최소값을 출력하는 프로그램을 작성하시오. 입력과 출력은 다음과 같다. input.txt로 T 개의 test set 이 입력으로 주어지고 각각의 test case 에는 다시 K개의 정수가 주어진다. output.txt에는 매 test 마다 한줄씩 총점, 최대값, 최소값을 출력한다.
(Hint: K개의 data를 입력받기 위해 malloc(K * sizeof(int)) 로 메모리를 할당 받고, free로 메모리를 반환하여야 함)
input.txt | output.txt |
3 3 11 22 33 4 2 5 7 3 6 10 30 11 22 44 33 |
66 33 11 17 7 2 150 44 10 |
동적 할당에 관한 복습 문제.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
void main()
{
int i, j, T, K, sum, min, max;
int* data;
scanf("%d", &T); // 테스트 케이스의 수 3
for (i = 0; i < T; i++) {
sum = 0;
// 데이타 갯수 K 를 입력을 받고
scanf("%d", &K);
// malloc()으로 data[] 공간 확보
data = malloc(K * sizeof(int));
// for j = 0 ~ K-1 까지
for (j = 0; j < K; j++) {
// data[j] 입력
scanf("%d", &data[j]);
// sum 누적
sum += data[j];
}
// max, min 을 찾는다
max = data[0];
min = data[0];
for (j = 1; j < K; j++) {
max = max < data[j] ? data[j] : max;
min = min > data[j] ? data[j] : min;
}
// sum, max, min 을 출력한다.
printf("%d %d %d\n", sum, max, min);
// free()로 data 공간 반환
free(data);
}
}
문제 7.
https://codejin.tistory.com/36
'대학교 > 프로그래밍랩' 카테고리의 다른 글
[프로그래밍 랩] 6주차 - 행렬, 구조체, 포인터 (0) | 2021.10.07 |
---|---|
[프로그래밍 랩] 5주차 - 난수, 확률, 통계 (0) | 2021.09.30 |
[프로그래밍 랩] 4주차 - 재귀 (0) | 2021.09.26 |
[프로그래밍 랩] 3주차 - 실행 시간 (0) | 2021.09.18 |
[프로그래밍 랩] 1주차 - C언어 복습 1 (0) | 2021.09.10 |