반응형
16. 문자열을 이용하여 이진수 덧셈을 하는 프로그램을 작성하라. 이진수는 80자리까지 입력 가능하다고 가정하라.
#include <stdio.h> #include <stdlib.h> #include <string.h> char* binaryAdd (char* b1, char* b2); int main() { char b1[80]; char b2[80]; int ok = 1; do { printf("첫번째 2진수를 입력하세요 :"); scanf_s("%s", b1, 80); while (getchar() != '\n') {} for (int i = 0; b1[i] != '\0'; i++) { if (!(b1[i] == '0' || b1[i] == '1')) { ok = 1; break; } else { ok = 0; } } } while (ok); do { printf("두번째 2진수를 입력하세요 :"); scanf_s("%s", b2, 80); while (getchar() != '\n') {} for (int i = 0; b2[i] != '\0'; i++) { if (!(b2[i] == '0' || b2[i] == '1')) { ok = 1; break; } else { ok = 0; } } } while (ok); printf("%s \n", binaryAdd(b1, b2)); } char* binaryAdd(char* b1, char* b2) { char *p1 = b1; char *p2 = b2; int p1len = strlen(b1); int p2len = strlen(b2); int an = (p1len > p2len) ? p1len : p2len; static char result[81] = { '0', }; //맨 처음 값만 '0', 그외는 모두 '\0' char *pr = &result[an]; //포인터 pr의 두 문자열 중 긴 것의 마지막 숫자 위치. while (*p1) { p1++; } //포인터 p1을 문자열 끝(NULL)으로 보낸다. while (*p2) { p2++; } //포인터 p2를 문자열 끝(NULL)으로 보낸다. p1--; p2--; // 마지막 문자에 있는 상태 while (an >= 0) { if (*p1 == '0' && *p2 == '0') { //더해지는 수가 모두 '0'일때 if (*pr == '0' || *(pr + 1) == '\0') { //첫 시작이거나 자리올림수가 '0'일때 *pr = '0'; //현재 위치 최종적으로 '0' *(pr - 1) = '0'; //자리올림수 '0' } else if (*pr == '1') { //자리올림수가 1일 때, *pr = '1'; //현재 위치 최종적으로 '1' *(pr - 1) = '0'; //자리올림수 '0' } } else if (*p1 == '1' && *p2 == '1') { //더해지는 수가 모두 '1'일때 if (*pr == '0' || *(pr + 1) == '\0') { //첫 시작이거나 자리올림수가 '0'일때 *pr = '0'; //현재 위치 최종적으로 '0' *(pr - 1) = '1'; //자리올림수 '1' } else if (*pr == '1') { //자리올림수가 1일 때, *pr = '1'; //현재 위치 최종적으로 '1' *(pr - 1) = '1'; //자리올림수 '1' } } else if (*p1 == '1' || *p2 == '1') { //둘중 하나만 1일 때 if (*pr == '0' || *(pr + 1) == '\0') { //첫 시작이거나 자리올림수가 '0'일때 *pr = '1'; //현재 위치 최종적으로 '1' *(pr - 1) = '0'; //자리올림수 '0' } else if (*pr == '1') { //자리올림수가 1일 때, *pr = '0'; //현재 위치 최종적으로 '0' *(pr - 1) = '1'; //자리올림수 '1' } } p1--; p2--; pr--; an--; //모두 한칸씩 앞으로 당기기 } return result; }
17. 문자열을 이용하여 십진수 덧셈을 하는 프로그램을 작성하라. 십진수는 80자리까지 입력 가능하다고 가정하라.
#include <stdio.h> #include <stdlib.h> #include <string.h> char* binaryAdd (char* b1, char* b2); int main() { char b1[80]; char b2[80]; int ok = 1; do { printf("첫번째 10진수를 입력하세요 :"); scanf_s("%s", b1, 80); while (getchar() != '\n') {} for (int i = 0; b1[i] != '\0'; i++) { if (b1[i] <= '0' && b1[i] >= '9') { ok = 1; break; } else { ok = 0; } } } while (ok); do { printf("두번째 2진수를 입력하세요 :"); scanf_s("%s", b2, 80); while (getchar() != '\n') {} for (int i = 0; b2[i] != '\0'; i++) { if (b1[i] <= '0' && b1[i] >= '9') { ok = 1; break; } else { ok = 0; } } } while (ok); printf("%s \n", binaryAdd(b1, b2)); } char* binaryAdd(char* b1, char* b2) { char *p1 = b1; char *p2 = b2; int p1len = strlen(b1); int p2len = strlen(b2); int an = (p1len > p2len) ? p1len : p2len; static char result[81] = { '0', }; //맨 처음 값만 '0', 그외는 모두 '\0' char *pr = &result[an]; //포인터 pr의 두 문자열 중 긴 것의 마지막 숫자 위치. while (*p1) { p1++; } //포인터 p1을 문자열 끝(NULL)으로 보낸다. while (*p2) { p2++; } //포인터 p2를 문자열 끝(NULL)으로 보낸다. p1--; p2--; // 마지막 문자에 있는 상태 while (an >= 0) { if (*pr == '0' || *(pr + 1) == '\0') { // 자리올림수가 0이거나 첫시작일때 if ((*p1 - 48) + (*p2 - 48) < 10) { // 두수의 합이 10보다 작을때 *(pr - 1) = '0'; // 자리올림수가 0 switch ((*p1 - 48) + (*p2 - 48)) { case 0: *pr = '0'; break; case 1: *pr = '1'; break; case 2: *pr = '2'; break; case 3: *pr = '3'; break; case 4: *pr = '4'; break; case 5: *pr = '5'; break; case 6: *pr = '6'; break; case 7: *pr = '7'; break; case 8: *pr = '8'; break; case 9: *pr = '9'; break; } } else { //두수의 합이 10보다 클때 *(pr - 1) = '1'; //자리올림수가 1 switch ((*p1 - 48) + (*p2 - 48) - 10) { case 0: *pr = '0'; break; case 1: *pr = '1'; break; case 2: *pr = '2'; break; case 3: *pr = '3'; break; case 4: *pr = '4'; break; case 5: *pr = '5'; break; case 6: *pr = '6'; break; case 7: *pr = '7'; break; case 8: *pr = '8'; break; case 9: *pr = '9'; break; } } } else { //자리올림수가 1일때 if ((*p1 - 48) + (*p2 - 48) + 1 < 10) { // 두수의 합 +1이 10보다 작을때 *(pr - 1) = '0'; // 자리올림수가 0 switch ((*p1 - 48) + (*p2 - 48) + 1) { case 0: *pr = '0'; break; case 1: *pr = '1'; break; case 2: *pr = '2'; break; case 3: *pr = '3'; break; case 4: *pr = '4'; break; case 5: *pr = '5'; break; case 6: *pr = '6'; break; case 7: *pr = '7'; break; case 8: *pr = '8'; break; case 9: *pr = '9'; break; } } else { //두수의 합 +1이 10보다 클때 *(pr - 1) = '1'; //자리올림수가 1 switch ((*p1 - 48) + (*p2 - 48) +1 - 10) { case 0: *pr = '0'; break; case 1: *pr = '1'; break; case 2: *pr = '2'; break; case 3: *pr = '3'; break; case 4: *pr = '4'; break; case 5: *pr = '5'; break; case 6: *pr = '6'; break; case 7: *pr = '7'; break; case 8: *pr = '8'; break; case 9: *pr = '9'; break; } //스위치문 끝 } // 두수의 합이 10보다 클 때 else문 끝 } // 자리올림수가 1일때 끝 p1--; p2--; pr--; an--; //모두 한칸씩 앞으로 당기기 } return result; }
반응형