C 언어 개인 코드 요약(상)
21649 단어 C 코드 영역
1、생일 입력, 별자리 판단
메서드 1(초급):
int y = 0, m = 0, d = 0;
scanf("%d%d%d", &y, &m, &d);
y = 2014 - y;
if (m == 1) {
if (d <= 21){
printf("%d ,
", y);
} else {
printf("%d ,
", y);
}
} else if (m == 2) {
if (d <= 19){
printf("%d ,
", y);
} else {
printf("%d ,
", y);
}
} else if (m == 3) {
if (d <= 20){
printf("%d ,
", y);
} else {
printf("%d ,
", y);
}
} else if (m == 4) {
if (d <= 20){
printf("%d ,
", y);
} else {
printf("%d ,
", y);
}
} else if (m == 5) {
if (d <= 21){
printf("%d ,
", y);
} else {
printf("%d ,
", y);
}
} else if (m == 6) {
if (d <= 21){
printf("%d ,
", y);
} else {
printf("%d ,
", y);
}
} else if (m == 7) {
if (d <= 22){
printf("%d ,
", y);
} else {
printf("%d ,
", y);
}
} else if (m == 8) {
if (d <= 22){
printf("%d ,
", y);
} else {
printf("%d ,
", y);
}
} else if (m == 9) {
if (d <= 23){
printf("%d ,
", y);
} else {
printf("%d ,
", y);
}
} else if (m == 10) {
if (d <= 23){
printf("%d ,
", y);
} else {
printf("%d ,
", y);
}
} else if (m == 11) {
if (d <= 22){
printf("%d ,
", y);
} else {
printf("%d ,
", y);
}
} else if (m == 12) {
if (d <= 21){
printf("%d ,
", y);
} else {
printf("%d ,
", y);
}
}
메서드 2(업그레이드 버전):
int y = 0, m = 0, d = 0;
scanf("%d-%d-%d", &y, &m, &d);
int days2 = 28;
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
days2++;
}
int md = m * 100 + d;
if ((md >= 321 && md <= 331) || (md >= 401 && md <= 419)) {
printf("
");
} else if ((md >= 420 && md <= 430) || (md >= 501 && md <= 520)) {
printf("
");
} else if ((md >= 521 && md <= 531) || (md >= 601 && md <= 621)) {
printf("
");
} else if ((md >= 622 && md <= 630) || (md >= 701 && md <= 722)) {
printf("
");
} else if ((md >= 723 && md <= 731) || (md >= 801 && md <= 822)) {
printf("
");
} else if ((md >= 823 && md <= 831) || (md >= 901 && md <= 922)) {
printf("
");
} else if ((md >= 923 && md <= 931) || (md >= 1001 && md <= 1023)) {
printf("
");
} else if ((md >= 1024 && md <= 1031) || (md >= 1101 && md <= 1122)) {
printf("
");
} else if ((md >= 1123 && md >= 1130) || (md >= 1201 && md <= 1221)) {
printf("
");
} else if ((md >= 1222 && md <= 1231) || (md >= 101 && md <= 119)) {
printf("
");
} else if ((md >= 120 && md <= 131) || (md >= 201 && md <= 218)) {
printf("
");
} else if ((md >= 219 && md <= days2) || (md >= 301 && md <= 322)) {
printf("
");
} else {
printf("
");
}
for와while 순환
2. 두 수의 최대 공약수와 최소 공배수를 구한다
int a = 0, b = 0, m = 0;
scanf("%d%d", &a, &b);
for (int i = a; i >= 1; i--) {
if (b % i == 0 && a % i == 0) {
m = i;
printf(" :%d
", i);
printf(" :%d
", a * b / i);
break;
}
}
전전 상제법(최대 공약수 구하기):
int a = 0, b = 0;
scanf("%d%d", &a, &b);
int a1 = a, b1 = b;
while (a1 % b1 != 0) {
int x = a1 % b1;
a1 = b1;
b1 = x;
}
printf("%d
", b1);
3. 실심 마름모
메소드 1(초급)
int n = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n - i; j++) {
printf(" ");
}
for (int k = 1; k <= i * 2 - 1; k++) {
printf("*");
}
printf("
");
}
for (int i = n - 1; i >= 1; i--) {
for (int j = n - 1; j >= i; j--) {
printf(" ");
}
for (int k = 1; k <= i * 2 - 1; k++) {
printf("*");
}
printf("
");
}
메서드 2(업그레이드 버전):
int n = 0;
scanf("%d", &n);
for (int i = 1; i <= 2 * n - 1; i++) {
int x = (2 * n - 1) - (abs(i - n) * 2); // abs() ;
for (int k = 1; k <= abs(i - n); k++) {
printf(" ");
}
for (int j = 1; j <= x; j++) {
printf("*");
}
printf("
");
}
4. 빈 마름모꼴:
int n = 0;
scanf("%d", &n);
for (int i = 1; i <= 2 * n - 1; i++) {
int x1 = abs(i - n);//
int x2 = (2 * n - 1) - x1 * 2;
for (int k = 1; k <= x1; k++) {
printf(" ");
}
for (int j = 1; j <= x2; j++) {
if (j == 1 || j == x2) {
printf("*");
} else {
printf(" ");
}
}
printf("
");
}
5, 99 곱셈표:
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
printf("%d * %d = %2d ", j, i, i * j);
}
printf("
");
}
6、n개 랜덤 수 중 두 번째로 큰 수를 찾기:
메서드 1(초급):
랜덤수를 두루 훑어보고 맏형보다 크면 맏형이 원래 있던 것을 둘째에게 주도록 한다.만약에 맏이가 크지 않으면 둘째와 비교하고 둘째보다 크면 둘째와 교환한다.
int i = 1, n = 0;
unsigned int max = 0, sec = 0;
scanf("%d", &n);
while (i <= n) {
unsigned int random = arc4random() % (60 - 20 + 1) + 20;
printf("%u
", random);
if (i == 1) {
max = sec = random;
} else if (i == 2) {
if (random > max) {
max = random;
} else {
sec = random;
}
} else if (i >= 3) {
if (random > max) {
sec = max;
max = random;
} else if (random > sec) {
sec = random;
}
}
i++;
}
printf("sec = %u
", sec);
printf("max = %u
", max);
메서드 2(업그레이드 버전):
같은 방법과 같은 사상은 코드가 간소화되었을 뿐이다.
int n = 0;
scanf("%d", &n);
unsigned int max = 0, max2 = 0;
while (n > 0) {
unsigned int random = arc4random() % (70 - 30 + 1) + 30;
printf("%u
", random);
if (max < random) {
max2 = max;
max = random;
} else if (max2 < random) {
max2 = random;
}
n--;
}
printf("max = %u, max2 = %u
", max, max2);
방법 3:
랜덤으로 큰 것을 둘째에게 주고 둘째는 맏이와 비교하고 큰 것은 맏이에게 준다.
int n = 0, temp = 0;
scanf("%d", &n);
unsigned int max = 0, max2 = 0;
while (n > 0) {
unsigned int random = arc4random() % (70 - 30 + 1) + 30;
printf("%u
", random);
if (random > max2) {
max2 = random;
if (max2 > max) {
temp = max;
max = max2;
max2 = temp;
}
}
n--;
}
printf("max = %u, max2 = %u
", max, max2);
배열
1, 3 가지 정렬, 1 가지 검색
거품 발생:
int array[] = {3, 2, 6, 9, 8, 5, 7, 1, 4};
int count = sizeof(array) / sizeof(array[0]);
int temp;
int flag = 1;//1 ,0
for (int i = 0; i < count - 1 && 1 == flag; i++) {
flag = 0;//
for (int j = 0; j < count - i - 1; j++) {
if (array[j] > array[j + 1]) {
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
flag = 1;// ,
}
}
}
for (int i = 0; i < count; i++) {
printf("[%2d] : %d
", i, array[i]);
}
선택:
int array[] = {3, 5, 6, 7, 8, 9, 2, 1, 4};
int count = sizeof(array) / sizeof(array[0]);
for (int i = 0; i < count - 1; i++) {
int minIndex = i;
for (int j = minIndex + 1; j < count; j++) {
if (array[minIndex] > array[j]) {
minIndex = j;
}
}
if (minIndex != i) {
int temp;
temp = array[i];
array[i] = array[minIndex];
array[minIndex] = temp;
}
}
for (int i = 0; i < count; i++) {
printf("[%2d] : %d
", i, array[i]);
}
삽입:
int array[] = {3, 2, 6, 9, 8, 5, 7, 1, 4};
int count = sizeof(array) / sizeof(array[0]);
for (int i = 1; i < count; i++) {
int temp = array[i];
int j = i-1;
while (j >= 0 && array[j] > temp) {
array[j+1] = array[j];
j--;
}
if (j != i-1) {
array[j+1] = temp;
}
}
for (int i = 0; i < count; i++) {
printf("[%2d] : %d
", i, array[i]);
}
절반으로 찾기:
int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int count = sizeof(array) / sizeof(array[0]);
int start = 0, end = count - 1, mid = 0;
int target = 0;
scanf("%d", &target);
while (start <= end) {
mid = (start + end) / 2;
if (array[mid] > target) {
end = mid - 1;
} else if (array[mid] < target) {
start = mid + 1;
} else {
break;
}
}
if (start <= end) {
printf("[%2d] : %d
", mid, array[mid]);
} else {
printf("no
");
}
2、날짜를 입력하고 이 해의 며칠째로 되돌아간다
메서드 1(초급):
잘못된 날짜를 입력하는 것을 고려하지 않은 것이 결함이다.
int y = 0, m = 0, d = 0, days = 28, sum = 0;
scanf("%d-%d-%d", &y, &m, &d);
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
days++;
}
for (int i = 1; i < m; i++) {
sum = 31 * i;
}
if (m > 11) {
sum -= (4 + 31 - days - d);
} else if (m > 9) {
sum -= (3 + 31 - days - d);
} else if (m > 6) {
sum -= (2 + 31 - days - d);
} else if (m > 4) {
sum -= (1 + 31 - days - d);
} else if (m > 2) {
sum -= (31 - days - d);
} else {
sum += d;
}
printf("sum = %d
", sum);
메서드 2(업그레이드 버전, 함수 호출):
bool checkDateValiable(unsigned year, unsigned month, unsigned day)
{
bool result = true;
unsigned days = 0;
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = 31;
break;
case 4:
case 6:
case 9:
case 11:
days = 30;
break;
case 2:
days = 28 + daysOfLeapyear(year);
default:
break;
}
if (0 == days || day > days || 0 == day) {
result = false;
}
return result;
}
unsigned int daysOfLeapyear(unsigned int year)
{
return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}
unsigned dayOfYear(unsigned year, unsigned month, unsigned day)
{
if (!checkDateValiable(year, month, day)) {
return 0;
}
int daysOfMonth[12] = {
0,
31,
31 + 28,
31 + 28 + 31,
31 + 28 + 31 + 30,
31 + 28 + 31 + 30 + 31,
31 + 28 + 31 + 30 + 31 + 30,
31 + 28 + 31 + 30 + 31 + 30 + 31,
31 + 28 + 31 + 30 + 31 + 30 + 31 + 31,
31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30,
31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31,
31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30,
};
int days = day + daysOfMonth[month - 1];
if (month > 2) {
days += daysOfLeapyear(year);
}
return days;
}
3. 그룹 혼란
수조는 모두 9개의 원소로 9개의 랜덤수를 생성하고 매번 랜덤수가 발생하는 범위는 9에서 1까지 차례로 줄어들며 발생하는 랜덤수는 하표로 하고 하표에 대응하는 수를 수조의 마지막 원소와 교환한다.
int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int count = sizeof(array) / sizeof(array[0]);
for (int i = count - 1; i > 0; i--) {
unsigned int random = arc4random() % (i + 1);
int temp;
temp = array[i];
array[i] = array[random];
array[random] = temp;
}
for (int i = 0; i < count; i++) {
printf("[%2d] : %d
", i, array[i]);
}
4. 문자열 함수 구현
(1) 문자열의 길이strlen
char string1[10] = "iphone";
int i = 0;
while (string1[i] != '\0') {
printf("%c", string1[i]);
i++;
}
printf("
");
printf("length = %d
", i);
(2) 문자열의 복사strcpy
char string1[10] = "iphone";
char string3[] = "android";
int i = 0;
while ((string1[i] = string3[i]) != '\0') {
i++;
}
printf("%s
", string1);
(3) 문자열의 결합strcat
char string1[30] = "iPhone";
char string2[] = "android";
int i = 0, j = 0;
while (string1[i] != '\0') {
i++;
}
while ((string1[i] = string2[j])) {
i++;
j++;
}
printf("%s
", string1);
(4) 문자열의 비교strcmp
char string1[] = "abcd";
char string2[] = "abed";
int result = 0, i = 0;
while (0 == (result = string1[i] - string2[i])) {
if ('\0' == string1[i]) {
break;
}
i++;
}
printf("%d
", result);
5. 2번 노선 통합
int a1[] = {3, 6, 8, 9, 4}, a2[] = {1, 5, 2, 0, 7};
int count1 = sizeof(a1) / sizeof(a1[0]);
int count2 = sizeof(a2) / sizeof(a2[0]);
int a3[count1 + count2];
int flag = 1, temp = 0;
for (int i = 0; i < 5 - 1; i++) {
flag = 0;
for (int j = 0; j < 5 - i - 1; j++) {
if (a1[j] > a1[j + 1]) {
temp = a1[j];
a1[j] = a1[j + 1];
a1[j + 1] = temp;
flag = 1;
}
if (a2[j] > a2[j + 1]) {
temp = a2[j];
a2[j] = a2[j + 1];
a2[j + 1] = temp;
}
}
}
int i = 0, j = 0, k = 0;
while (i < 5 && j < 5) {
if (a1[i] < a2[j]) {
a3[k] = a1[i];
i++;
k++;
} else if (a1[i] > a2[j]) {
a3[k] = a2[j];
j++;
k++;
}
}
while (i < count1) {
a3[k++] = a1[i++];
}
while (j < count2) {
a3[k++] = a2[j++];
}
for (int i = 0; i < 5; i++) {
printf("a1[%2d] : %d
", i, a1[i]);
}
for (int i = 0; i < 5; i++) {
printf("a2[%2d] : %d
", i, a2[i]);
}
for (int i = 0; i < 10; i++) {
printf("a3[%2d] : %d
", i, a3[i]);
}
선거
int array[5], n = 0;
int count = sizeof(array) / sizeof(array[0]);
int index[count];
for (int i = 0; i < count; i++) {
index[i] = i;
}
printf(" :");
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
unsigned int random = arc4random() % ('E' - 'A' + 1) + 'A';
array[random - 'A']++;
}
for (int i = 0; i < count - 2; i++) {
for (int j = 0; j < count - i - 2; j++) {
if (array[index[j]] < array[index[j + 1]]) {
int temp;
temp = index[j];
index[j] = index[j + 1];
index[j + 1] = temp;
}
}
}
for (int i = 0; i < count - 1; i++) {
printf("[%c] : %d
", index[i] + 'A', array[index[i]]);
}
printf(" :%d
", array[4]);
7. 색인 배열 정렬
거품 발생법:
int array[] = {3, 2, 6, 9, 8, 5, 7, 1, 4};
int count = sizeof(array) / sizeof(array[0]);
int index[count];
for (int i = 0; i < count; i++) {
index[i] = i;
}
int flag = 1;
for (int i = 0; i < count - 1 && 1 == flag; i++) {
flag = 0;
for (int j = 0; j < count - i - 1; j++) {
if (array[index[j]] > array[index[j + 1]]) {
int temp = index[j];
index[j] = index[j + 1];
index[j + 1] = temp;
flag = 1;
}
}
}
for (int i = 0; i < count; i++) {
printf("[%2d] : %d
", index[i], array[index[i]]);
}
선택 방법:
int array[] = {3, 2, 6, 9, 8, 5, 7, 1, 4};
int count = sizeof(array) / sizeof(array[0]);
int index[count];
for (int i = 0; i < count; i++) {
index[i] = i;
}
for (int i = 0; i < count - 1; i++) {
int minIndex = i;
for (int j = minIndex + 1; j < count; j++) {
if (array[index[minIndex]] > array[index[j]]) {
minIndex = j;
}
}
int temp = index[minIndex];
index[minIndex] = index[i];
index[i] = temp;
}
for (int i = 0; i < count; i++) {
printf("[%2d] : %d
", index[i], array[index[i]]);
}
삽입법:
int array[] = {3, 2, 6, 9, 8, 5, 7, 1, 4};
int count = sizeof(array) / sizeof(array[0]);
int index[count];
for (int i = 0; i < count; i++) {
index[i] = i;
}
for (int i = 1; i < count; i++) {
int j = i;
int tempIndex = index[j];
while (j > 0 && array[tempIndex] < array[index[j - 1]]) {
index[j] = index[j - 1];
j--;
}
index[j] = tempIndex;
}
for (int i = 0; i < count; i++) {
printf("[%2d] : %d
", index[i], array[index[i]]);
}
8、문자열의 중간 위치 찾기(면접문제)
char string1[] = "a12b3c45def6g789";
int i = 0, j = 0;
while (1) {
if ('\0' == string1[i]) {
break;
}
i++;
if ('\0' == string1[i]) {
break;
}
i++;
j++;
}
printf("%c
", string1[j]);
9. 2차원 그룹의'안장점'을 찾아라. 즉, 이 위치의 요소가 이 줄에서 가장 크고 이 열에서 가장 작으며 관련 정보를 인쇄한다.(팁: 안장 지점이나 여러 개의 안장 지점이 없도록 주의)
int array[3][4] = {4, 5, 23, 7, 8, 21, 56, 65, 27, 9, 25, 62};
int a[3] = {0}, b[4] = {0};
int count1 = sizeof(array) / sizeof(array[0]);
int count2 = sizeof(array[0]) / sizeof(array[0][0]);
int max = 0, min = 0, m = 0;
for (int i = 0; i < count1; i++) {
max = 0;
for (int j = 0; j < count2; j++) {
if (max < array[i][j]) {
max = array[i][j];
}
}
a[i] = max;
}
for (int i = 0; i < count2; i++) {
min = 100;
for (int j = 0; j < count1; j++) {
if (min > array[j][i]) {
min = array[j][i];
}
}
b[i] = min;
}
for (int i = 0; i < count1; i++) {
for (int j = 0; j < count2; j++) {
if (a[i] == b[j]) {
printf(" [%2d][%2d] : %d
", i, j, a[i]);
m = 1;
}
}
}
if (m != 1) {
printf("no!
");
}
10, 1 ~ 백만 랜덤 수, 어떻게 바로 알 중복
int a[1000001] = {0};
while (1) {
unsigned int random = arc4random() % (1000000 - 1 + 1) + 1;
if (a[random] == 0) {
a[random] = random;
printf("[%2d] : %d
", random, a[random]);
} else {
printf("
");
break;
}
}