01. 소수 구하기( <-> 합성수)
소수 : 1과 자기 자신 외에 약수가 없는 수
int isPrime(int n) {
for (int i = 2; i <= n / 2; i++)
if (n % i == 0)
return 0;
return 1;
}
(Lab 5-1) 화면과 같이 2 ~ 100 까지 수 중에서 솟수(1과 자기 자신 외에 약수가 없는 수)를 모두 출력하고, 그 소수들의 합을 구하는 프로그램을 작성하시오. 솟수인지 아닌지 판단하는 함수 isPrime(int n)을 작성해서 이용할 것. isPrime(int n) 는 n이 솟수이면 1, 솟수가 아니면 0을 return 한다.
#include <stdio.h>
int isPrime(int n) {
for (int i = 2; i <= n / 2; i++)
if (n % i == 0)
return 0;
return 1;
}
void main() {
int i, sum = 0;
for (i = 2; i <= 100; i++) {
if (isPrime(i)) {
printf("%d ", i);
sum += i;
}
}
printf("\n");
printf("sum=%d\n", sum);
}
+범위를 입력받을경우
- 입력받은 값이 2보다 작을 경우
기존 함수의 경우 ~ 1 도 소수 인정하기 때문에
if ( n < 2) return 0; 을 추가해야함 - n1 > n2일 경우
n1과 n2의 값을 바꿔줘야 함
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void swap(int* a, int* b);
int isPrime(int n);
void main() {
int i, sum = 0, n1, n2, temp;
printf("소수를 구할 정수의 범위를 작은 수와 큰 수의 순서로 입력(예: 2 100): ");
scanf("%d %d", &n1, &n2);
if (n1 > n2) { // n1의 값이 n2의 값보다 클 경우
swap(&n1, &n2);
}
for (i = n1; i <= n2; i++) {
if (isPrime(i)) {
printf("%d ", i);
sum += i;
}
}
printf("\n");
printf("sum((%d ~ %d)의 소수 합)=%d\n", n1, n2, sum);
}
void swap(int* a, int* b) {
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int isPrime(int n) {
if (n < 2) return 0; // n이 2보다 작으면 소수가 아니므로 0을 반환
for (int i = 2; i <= n / 2; i++)
if (n % i == 0)
return 0;
return 1;
}
01-1.합성수 구하기 (<-> 소수)
합성수: 약수가 3개 이상인 자연수, 즉 1과 자기 자신 외에도 다른 약수를 가지는 자연수
int isComposite(int n) {
for (int i = 2; i <= n / 2; i++)
if (n % i == 0)
return 1;
return 0;
}
02. 완전수 찾기 (+ 동적 할당 활용해보기)
완전수: 자기 자신을 제외한 약수(진 약수)의 합이 자기 자신과 같은 자연수
과정
- 1~ n/2 사이의 수 중에서 n의 약수이면 sum에 더한다
- sum == n 이면 완전수 임
- 어떤 수가 완전수인지 판단하는 것 + 완전수의 공약수 출력
문제: 화면과 같이 출력하려면?
6 = 1+2+3
->약수들을 int divisors[]에 보관한다.
(Lab 5-2) 완전수란 어떤 정수의 약수를 모두 더했을 때 자기 자신과 같은 수를 말한다. 예를 들어 6의 약수 1, 2, 3을 더하면 6으로 정수 자신이 되는 수이다. 다음 화면과 같이 1 ~ 10,000 사이의 수 중에서 완전수를 구해서 출력하는 프로그램을 작성하시오. (화면과 같이 나와야 함)
#include <stdio.h>
#define SIZE 100
void print_array(int divisor[], int count);
void main() {
int i, j, sum, temp;
int divisor[SIZE], count = 0;
for (i = 1; i <= 10000; i++) {
sum = 0;
for (j = 1; j <= i / 2; j++) {
if (i % j == 0){
sum += j;
}
}
if (i == sum) {
for (j = 1, count = 0; j <= i / 2; j++) {
if (i % j == 0)
divisor[count++] = j;
}
printf("%d = ", i);
print_array(divisor, count);
}
}
}
void print_array(int divisor[], int count) {
for (int i = 0; i < count; i++) {
printf("%d ", divisor[i]);
if (i < count - 1) // 마지막을 제외하고 + 출력
printf("+ ");
}
printf("\n");
}
함수로 정리
#include <stdio.h>
#define SIZE 100
int sum_properdivisor(int n);
int insert_divisor(int* divisor, int n);
void print_array(int divisor[], int count);
void main() {
int i, j, sum, temp;
int divisor[SIZE], count = 0;
for (i = 1; i <= 10000; i++) {
sum = sum_properdivisor(i);
if (i == sum) {
count = insert_divisor(divisor, i);
printf("%d = ", i);
print_array(divisor, count);
}
}
}
int sum_properdivisor(int n) {
int sum = 0;
for (int i = 1; i <= n / 2; i++) {
if (n % i == 0) {
sum += i;
}
}
return sum;
}
int insert_divisor(int* divisor, int n) {
int count = 0;
for (int i = 1; i <= n / 2; i++)
if (n % i == 0)
divisor[count++] = i;
return count;
}
void print_array(int divisor[], int count) {
for (int i = 0; i < count; i++) {
printf("%d ", divisor[i]);
if (i < count - 1) // 마지막을 제외하고 + 출력
printf("+ ");
}
printf("\n");
}
+범위를 입력 받는 경우
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define SIZE 100
void swap(int* a, int* b);
void print_array(int divisor[], int count);
void main() {
int i, j, sum, temp;
int n1, n2;
int divisor[SIZE], count = 0;
printf("완전수를 구할 정수의 범위를 작은 수와 큰 수의 순서로 입력(예:1 10000): ");
scanf("%d %d", &n1, &n2);
if (n1 < 1 || n2 < 1) { // 값이 1미만일 경우
return;
}
if (n1 > n2) { //n1의 값이 n2의 값보다 클 경우
swap(&n1, &n2);
}
for (i = n1; i <= n2; i++) {
sum = 0;
for (j = 1; j <= i / 2; j++) {
if (i % j == 0){
sum += j;
}
}
if (i == sum) {
for (j = 1, count = 0; j <= i / 2; j++) {
if (i % j == 0)
divisor[count++] = j;
}
printf("%d = ", i);
print_array(divisor, count);
}
}
}
void swap(int* a, int* b) {
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void print_array(int divisor[], int count) {
for (int i = 0; i < count; i++) {
printf("%d ", divisor[i]);
if (i < count - 1) // 마지막을 제외하고 + 출력
printf("+ ");
}
printf("\n");
}
함수로 정리
#include <stdio.h>
#define SIZE 100
void swap(int* a, int* b);
int sum_properdivisor(int n);
int insert_divisor(int *divisor, int n);
void print_array(int *divisor, int count);
void main() {
int i, j, sum;
int n1, n2;
int divisor[SIZE], count;
printf("완전수를 구할 정수의 범위를 작은 수와 큰 수의 순서로 입력(예:1 10000): ");
scanf("%d %d", &n1, &n2);
if (n1 < 1 || n2 < 1) // 값이 1미만일 경우
return;
if (n1 > n2) {
swap(&n1, &n2); //n1의 값이 n2의 값보다 클 경우
}
for (i = n1; i <= n2; i++) {
sum = sum_properdivisor(i);
if (i == sum) {
count = insert_divisor(divisor, i);
printf("%d = ", i);
print_array(divisor, count);
}
}
}
void swap(int* a, int* b) {
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int sum_properdivisor(int n) {
int sum = 0;
for (int i = 1; i <= n / 2; i++) {
if (n % i == 0)
sum += i;
}
return sum;
}
int insert_divisor(int* divisor, int n) {
int count = 0;
for (int i = 1; i <= n / 2; i++) {
if (n % i == 0)
divisor[count++] = i;
}
return count;
}
void print_array(int *divisor, int count) {
for (int i = 0; i < count; i++) {
printf("%d ", divisor[i]);
if (i < count - 1) // 마지막을 제외하고 + 출력
printf("+ ");
}
printf("\n");
}
+ 동적할당
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
void print_array(int* divisor, int count);
int get_sum(int n);
void main() {
int i, j, sum, count;
int size = 10; // 초기 크기 설정
int* divisor;
divisor = (int*)malloc(size * sizeof(int)); //
for (i = 1; i <= 10000; i++) {
sum = get_sum(i);
if (i == sum) {
for (j = 1,count = 0; j <= i / 2; j++) {
if (i % j == 0) {
if (count >= size) { //
size *= 2;
divisor = (int*)realloc(divisor, size * sizeof(int));
}
divisor[count++] = j;
}
}
printf("%d = ", i);
print_array(divisor, count);
}
}
free(divisor);
}
int get_sum(int n) {
int sum = 0;
for (int i = 1; i <= n / 2; i++) {
if (n % i == 0)
sum += i;
}
return sum;
}
void print_array(int* divisor, int count) {
for (int i = 0; i < count; i++) {
printf("%d ", divisor[i]);
if (i < count - 1)
printf("+ ");
}
printf("\n");
}
03. e^x 근사치 계산하기
Lab 5-3) e^x 는 수학적으로 다음과 같이 기술할 수 있다.
n 값을 증가시키면서 의 근사치를 구하는 myexp(int x) 함수를 작성하시오. 의 근사값 오차 범위는 1/10,000,000 로 정하고 값을 구하시오. 즉, (n)번째 합과 (n-1)번째 합의 차이가 0.0000001 이하일 때 까지 n 값을 증가하면서 합을 구한다 (n>12~25 정도에서 끝남). 화면과 같이 ~ 값을 math.h 의 exp(x) 값을 호출하여 출력하고 myexp(x) 값을 출력하여 비교하시오.
#include <stdio.h>
#include <math.h>
double myexp(int x)
{
int i;
double term, sum, oldsum;
oldsum = 0.0;
sum = 1.0;
term = 1.0;
for (int i = 1; (sum - oldsum) > 0.0000001; i++) { // (sum – oldsum) > 0.0000001 일 때 까지 i를 증가시키면서
term *= (double)x / i; // term = 을 구한다.
oldsum = sum; // oldsum = sum 으로 기억하고
sum += term; // sum = 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");
}
04. 파일을 이용한 데이터 입/출력
2가지 방법이 있음
- (커맨드 창) C:\>program < input.txt > output.txt
- (Visual Studio) 에서 설정 방법: 속성 - 디버그 - 명령 인수 => < input.txt > output.txt
(Lab 5-4) 파일을 이용한 입/출력 처리. 두 정수를 입력받아 합과 곱을 출력하는 프로그램을 입력은 input.txt, 츨력은 output.txt 를 이용하여 처리. (입력/출력이 1 set 인 경우)
#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);
}
(Lab 5-5) 파일 이용 입/출력, TEST CASE 가 T set인 경우, TEST 마다 입력 DATA는 1 set 인 경우.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void main()
{
int i, n_test, x, y;
scanf("%d", &n_test);
for (i = 0; i < n_test ; i++) {
scanf("%d %d", &x, &y);
printf("%d %d\n", x + y, x * y);
}
}
(Lab 5-6) 정수 배열을 입력받아 총점, 최대값, 최소값을 출력하는 프로그램을 작성하시오. 입력과 출력은 다음과 같다. input.txt로 T 개의 test set 이 입력으로 주어지고 각각의 test case 에는 다시 k개의 정수가 주어진다. output.txt에는 매 test 마다 한줄씩 총점, 최대값, 최소값을 출력한다.
(Hint: k개의 data를 입력받기 위해 malloc(k * sizeof(int)) 로 메모리를 할당 받고, free로 메모리를 반환하여야 함)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int find_max(int* p, int n);
int find_min(int* p, int n);
void main(){
int n_test, n_data, sum, min, max;
int* p = NULL;
scanf("%d", &n_test);
for (int i = 0; i < n_test; i++) {
sum = 0;
scanf("%d", &n_data);
p = (int*)malloc(sizeof(int)* n_data);
for (int j = 0; j < n_data; j++) {
scanf(" %d", &p[j]);
sum += p[j];
}
max = find_max(p, n_data);
min = find_min(p, n_data);
printf("%d %d %d\n", sum, max, min);
free(p);
}
}
int find_max(int* p, int n) {
int max = p[0];
for (int i = 1; i < n; i++) {
if (max < p[i])
max = p[i];
}
return max;
}
int find_min(int* p, int n) {
int min = p[0];
for (int i = 1; i < n; i++) {
if (min > p[i])
min = p[i];
}
return min;
}
(Lab 5-7) ACM 프로그래밍 대회 2014 예선문제. 호텔 객실 배정 프로그램. T 개의 입력, H, W, N 입력 (H: Hotel의 층수, W: 층당 객실수, N 번째 도착한 손님). 출력은 각 입력에 해당되는 방 번호.(별지참조)
(방법 1)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int T, H, W, N;
int x, y;
scanf("%d", &T);
for (int i = 0; i < T; i++) {
scanf("%d %d %d", &H, &W, &N);
if (W * H <= N) {
printf("수용 인원을 넘어섰습니다. \n");
continue;
}
y = N % H;
x = (N / H) + 1;
if (y == 0) {
y = H;
x = N / H;
}
printf("%d%02d\n", y, x);
}
}
(방법 2)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main() {
int T, H, W, N;
int** p = NULL;
int y, x;
scanf("%d", &T);
for (int i = 0; i < T; i++) {
scanf("%d %d %d", &H, &W, &N);
p = (int**)malloc(sizeof(int*) * H);
for (int j = 0; j < H; j++) {
p[j] = (int*)malloc(sizeof(int) * W);
}
for (int j = 0; j < H; j++) {
for (int k = 0; k < W; k++)
p[j][k] = (j + 1) * 100 + (k + 1);
}
y = (N - 1) % H;
x = (N - 1) / H;
printf("%d\n", p[y][x]);
for (int j = 0; j < H; j++) {
free(p[j]);
}
free(p);
}
}
'프로그래밍랩' 카테고리의 다른 글
프로그래밍랩 12주차 (0) | 2024.11.19 |
---|---|
프로그래밍랩 10-11 주차 (0) | 2024.11.08 |
[프로그래밍 랩] C언어 복습 문제 4 (0) | 2024.10.25 |
[프로그래밍 랩] C언어 복습 문제 5 (0) | 2024.10.25 |
[프로그래밍 랩] C언어 복습 문제 3 (0) | 2024.10.18 |