김지수 님이 쓰신 글 :
: 정수를요.. 진법계산을 해야되거든요..2-16진법까지 계산해야 됩니다
:
: 10의 256승까지 해야 되기 때문에 아스키코드를 이용해야된다고 하구요..예를 들어
:
: 423432414132132321312413231 (5진법) + 13231312131213231231241231231231231231(5진법) = ??
:
: 입력받은수를 아스키 코드로 바꿔서 아스키코드로 연산을 하고 그 결과값을
:
: 5진법으로 변환해서 출력을 하라 그러는것 같은데요..
:
: 어떻게 해야될지 모르겠습니다..
:
: 아시는분 계시면은 답변좀 부탁드립니다.
:
: 참고될 소스도 올려주시면 정말 감사하겠습니다..
글자 '0' = 아스키 코드 48
글자 '1~9' = 아스키 코드 49~57
아래는 알고리즘 설명입니다.
입력받은 "문자열" 이 5진수로 표현된 어떤 수라고 가정했을 때 5진수 문자열 '231' 은 10진수 문자열 '70' 이 됩니다.
해당 문제를 푸시려면
입력받은 문자열을 처음부터 검색해 가시면서 해당 글자를 하나씩 기억한 후 해당 진법에 맞게 곱해주고
그 결과를 모두 합한 값을 반환 (문자열을 숫자로 변환)
입력받은 숫자를 한 자리씩 꺼낸 후 꺼낸 한 글자들을 이어붙임 (숫자를 문자열로 변환)
이를 소스로 표현하면 다음처럼 되겠네요. 즉 atoi, itoa 의 5진법 버전을 만드셔야 한다는 것입니다.
진법 변환의 방법은 디지털 회로 서적 등을 참조하세요.
int atoi(char* s) { /* '문자열' 을 10진수 '값'으로 바꿔주는 함수 */
int i = 0;
while (*s >= '0' && *s <= '9')
i = (i*10 + s++) - '0'; /* 혹은 i = (i*10 + s++) - 49 */
return i;
} /* 숫자 10은 10진법을 의미함 */
char* itoa(int n, char* t) { /* 숫자를 문자열로 바꿔주는 함수: ANSI C 에는 char* itoa(int n, char* buffer, int radix) 로 정의됨 */
int i = 0;
while(n) {
*t = (n % 10) + '0'; /* 혹은 *t = (n % 10) + 49 */
n /= 10;
t++;
}
*t = '\0';
return t;
} /* 마찬가지로 이 함수의 숫자 10은 10진법을 의미 */
참고로 atoi, itoa 는 보통 stdlib.h 에 정의되어 있습니다.
그리고 한가지 주의하실 점은 위에 적은 itoa 함수의 소스는
입력받은 숫자에 대한 문자열은 거꾸로 저장되어 있으므로 이를 바른 순서로 바꿔주는 과정이 필요합니다.
즉 숫자 123 => 문자열 "321" 로 저장되어 있다는 것이죠.
|