forked from MinHwan-Park/PBL
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathChapter #6
123 lines (94 loc) · 5.13 KB
/
Chapter #6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
//6-1 정수 n개가 주어졌을 때, n개의 합을 구하는 함수를 작성하시오.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
long long sum(int* a, int n) {
long long add = 0;
for (int i = 0; i < n; i++) {
add += a[i];
}
return add;
}
int main(void) {
int size;
scanf("%d", &size);
int* array = (int*)malloc(sizeof(int) * size);
for (int i = 0; i < size; i++) {
scanf("%d", array+i);
}
printf("%d",sum(array, size));
free(array);
return 0;
}
long long sum(int *a, int n);
/*a: 합을 구해야 하는 정수 n개가 저장되어 있는 배열 (0 ≤ a[i] ≤ 1,000,000, 1 ≤ n ≤ 3,000,000)
n: 합을 구해야 하는 정수의 개수
리턴값: a에 포함되어 있는 정수 n개의 합
main함수
int형 size 선언하고 사용자에게 입력받은 값을 size주소에 저장 후 size만큼 크기의 int* array포인터형 변수를 만든다.
for문을 이용하여 i = 0부터 size보다 작을때까지 array배열에 입력하고 sum함수를 호출해서 출력한다. 마지막으로 동적할당 해제해준다.*/
![image](https://user-images.githubusercontent.com/80377779/115980042-94968e80-a5c4-11eb-8d6b-e43d1d2754da.png)
/*6-2 셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자.
예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때, 이 수를 시작해서 n, d(n), d(d(n)), d(d(d(n))), ...과 같은 무한 수열을 만들 수 있다.
예를 들어, 33으로 시작한다면 다음 수는 33 + 3 + 3 = 39이고, 그 다음 수는 39 + 3 + 9 = 51, 다음 수는 51 + 5 + 1 = 57이다. 이런식으로 다음과 같은 수열을 만들 수 있다.
33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ... n을 d(n)의 생성자라고 한다. 위의 수열에서 33은 39의 생성자이고, 39는 51의 생성자, 51은 57의 생성자이다.
생성자가 한 개보다 많은 경우도 있다. 예를 들어, 101은 생성자가 2개(91과 100) 있다. 생성자가 없는 숫자를 셀프 넘버라고 한다.
100보다 작은 셀프 넘버는 총 13개가 있다. 1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97
10000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 프로그램을 작성하시오.*/
#include <stdio.h>
int selfNum(int num)
{
int sum = num;
while (num > 0)
{
sum += num % 10;
num /= 10;
}
return sum;
}
int main(void)
{
int arr[10001] = { 0, };
for (int i = 1; i <= 10000; i++)
{
int num = selfNum(i);
if (num <= 10000) arr[num] = 1;
}
for (int j = 1; j <= 10000; j++)
{
if (arr[j] == 0) printf("%d\n", j);
}
return 0;
}
/*함수 selfNum을 만들어서 생성자에 해당하는 값인 sum을 return하도록 만들었습니다. main함수로 돌아와서 10000이하의 수들을 전부 확인해야 하므로 배열 arr[10001]={ 0, }을 통해서
0으로 초기화 해줍니다. 그 다음 반복문에서 정수형 num에 생성자 값들을 각각 넣고 그 중 10000이하의 값에 해당하는 값을 arr[num]에 1을 집어넣게 합니다.
그 다음 셀프넘버는 생성자가 없는 수를 의미하므로 반복문을 통해 arr[j] == 0에 해당하는 값을 셀프넘버라 할 수 있습니다. 마지막으로 이 값들을 출력해줍니다.*/
![image](https://user-images.githubusercontent.com/80377779/115980055-ad9f3f80-a5c4-11eb-97ff-8349efcbd569.png)
![image](https://user-images.githubusercontent.com/80377779/115980058-b09a3000-a5c4-11eb-829b-2a4f8aeca27b.png)
/*6-3 어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다.
N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.*/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int hansu(int num) {
int count = 0;
for (int i = 1; i <= num; i++) {
if (i / 10 == 0) count++;
else if (i / 100 == 0) count++;
else if ((i % 10) - ((i / 10) % 10) == ((i / 10) % 10) - i / 100) count++;
}
return count;
}
int main(void) {
int num;
scanf("%d", &num);
printf("%d",hansu(num));
return 0;
}
/*hansu(int num)
int형 count 변수 0으로 초기화해주고 i는 1부터 num까지 for문으로 반복한다. count는 한수의 개수를 세는 용도로 만듬.
i는 1부터 99까지는 등차수열 조건을 무조건 만족하기 때문에 i / 10 == 0 이면 count 1 증가시키고 i / 100 == 0 일때도 count 1 증가시킨다.
세자리부터는 등차수열 조건을 확인 해야하는데 조건식은 (i % 10) - ((i / 10) % 10) == ((i / 10) % 10) - i / 100 된다. 만약 123 이 있다면 3-2 == 2-1이기 때문에 한 수가 되는거고
124는 4-2 != 2-1 이기 때문에 한수 조건이 성립 안된다. 리턴값으로 count를 쓴다.
main 함수
int형 변수 num을 선언하고 사용자로부터 입력받은 수를 num의 주소에 저장한다. hansu(num) 함수를 출력한다*/
![image](https://user-images.githubusercontent.com/80377779/115980070-c60f5a00-a5c4-11eb-82cf-34a97d623eaf.png)