연재 완료/C Lang 예제코드 모음

C언어 연습문제 풀이 CH8 (16~17)

라이피 (Lypi) 2018. 5. 25. 23:05
반응형

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;
}


반응형