#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#pragma warning( disable : 4996 )
// 입력받은 숫자 2진수로의 변환 함수 -> 함수로 구현
void decToBi( char* str, int num );
// 2진수 덧셈 -> 함수로 구현
char* binaryPlus( char* str1, char* str2 );
void main( void )
{
// 10진수 변수 2개
int dec1 = 0;
int dec2 = 0;
// 2진수 변환될 문자열 변수 2개 - 32bit이므로 34선택
char bi1[34];
char bi2[34];
// 반환받을 2진수 공간
char* result = NULL;
// 10진수 입력
printf("첫번째 10진수 입력 : ");
scanf_s("%d", &dec1, 4 );
printf("두번째 10진수 입력 : ");
scanf_s("%d", &dec2, 4 );
// 함수로 반환될 2진수 변수
decToBi( bi1, dec1 );
decToBi( bi2, dec2 );
// 덧셈전 값 출력
printf("첫번째 10진수 : %d\t2진수 : %s\n", dec1, bi1 );
printf("두번째 10진수 : %d\t2진수 : %s\n", dec2, bi2 );
// 덧셈 함수 호출
result = binaryPlus( bi1, bi2 );
// 반환된 2진수 -> 10진수 변수
printf("10진수 두 수의 합 : %d\n", dec1 + dec2 );
printf("2진수 두 수의 합 : %s\n", result );
}
// 입력받은 숫자 2진수로의 변환 함수 -> 함수로 구현
void decToBi( char* str, int num )
{
itoa( num, str, 2 );
}
// 2진수 덧셈 -> 함수로 구현
char* binaryPlus( char* str1, char* str2 )
{
// 문자열 길이
unsigned int len1 = strlen( str1 );
unsigned int len2 = strlen( str2 );
// 문자열 임시공간 32bit 일때 최대 길이 33 + NULL
char temp[34] = "00000000000000000000000000000000";
// 완전수 저장할 공간
char perfect = '0';
// 더짧은 문자열 길이
int min = 0;
// 더긴 문자열 길이
int max = 0;
// 반복문 변수
int i;
// 뒤집힐 문자열
char* revStr1 = NULL;
char* revStr2 = NULL;
// 2진수 덧셈결과
char* result = NULL;
// 처음으로 나올 1 인덱스
int index = 0;
// 짧은 문자열 길이 구하기
if( len1 >= len2 )
{
max = len1;
min = len2;
}
else
{
max = len2;
min = len1;
}
// 문자열 뒤집기
revStr1 = strrev( str1 );
revStr2 = strrev( str2 );
// 문자열 덧셈 시작
for( i = 0; i < 34; i++ )
{
// 짧은 문자열까지의 덧셈
if( i < min+1 )
{
// 둘다 1 일 떄
if( str1[i] == '1' && str2[i] == '1' )
{
// 완전수가 0 일 떄
if( perfect == '0' )
{
// 해당값은 0으로
temp[i] = '0';
// 완전수는 1로
perfect = '1';
}
// 완전수가 1 일 떄
else
{
// 해당값은 1로
temp[i] = '1';
// 완전수는 1로
perfect = '1';
}
}
// 둘중 하나가 1일 떄
else if( str1[i] == '1' || str2[i] == '1' )
{
// 완전수가 0 일 떄
if( perfect == '0' )
{
// 해당값은 1로
temp[i] = '1';
// 완전값은 0으로
perfect = '0';
}
// 완전수가 1 일 떄
else
{
// 해당값은 0으로
temp[i] = '0';
// 완전값은 1로
perfect = '1';
}
}
// 둘다 0일 떄
else
{
// 완전수가 0 일 떄
if( perfect == '0' )
{
// 해당값은 0
temp[i] = '0';
}
// 완전수가 1 일 떄
else
{
// 해당값은 1
temp[i] = '1';
// 완전수는 0
perfect = '0';
}
}
}
// 긴 문자열까지의 덧셈
else if( i < max )
{
// 완전수가 0 일 떄
if( perfect == '0' )
{
// str1 길이가 더길때
if( max == len1 )
{
temp[i] = str1[i];
}
else
{
temp[i] = str2[i];
}
}
// 완전수가 1 일 떄
else
{
// str1이 더 길 떄
if( max == len1 )
{
// 해당값이 1일때
if( str1[i] == '1' )
{
// 해당값을 0으로
temp[i] = '0';
// 완전수 1로
perfect = '1';
}
else
{
// 해당값 1로
temp[i] = '1';
// 완전수 0으로
perfect = '0';
}
}
else
{
// 해당값이 1일때
if( str2[i] == '1' )
{
// 해당값을 0으로
temp[i] = '0';
// 완전수 1로
perfect = '1';
}
else
{
// 해당값 1로
temp[i] = '1';
// 완전수 0으로
perfect = '0';
}
}
}
}
}
// 덧셈이 끝나면 temp를 뒤집는다.
result = strrev( temp );
// 처음으로 나오는 1부터 마지막까지 문자열을 복사하고 리턴
for( i = 0; i < 32; i++ )
{
if( result[i] == '1' )
{
index = i;
break;
}
}
strcpy( str1, &result[index] );
return str1;
}
여기서 양의정수, 음의정수 입력하고 2진수로 변환 될때 출력값이 16자리로 나오게 하고싶은데 어디를 수정해야 하나요?
ㄴ어떤식으로 바꾸면 되나요?