10진수를 n진수로 변환하기

다음은 233 이란 10진수를 2진수로 변환하는 과정을 나타낸 그림이다.

위 그림을 참조하여 라이브러리를 사용하지 말고 10진수를 n진수로 변환하는 프로그램을 작성하시오.. (단, n의 범위는 2 <= n <= 16)

예)

  • 2진수로 변환 : 23310 --> 111010012
  • 8진수로 변환 : 23310 --> 3518
  • 16진수로 변환 : 23310 --> E916
stack
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

7개의 풀이가 있습니다.

clojure

(ns base.core)


(def NUM_DIC
  (->> "0123456789ABCDEF"
       (map-indexed vector)
       (into {})))


(defn- _base10->n
  ([num base]
     (_base10->n num base '()))

  ([num base acc]
     (let [q (quot num base)
           r (rem num base)]
       (if (zero? q)
         (conj acc r)
         (recur q base (conj acc r))))))


(defn base10->n
  [num base]

  (->> (_base10->n num base)
       (map #(NUM_DIC %))
       (apply str)))


(base10->n 233 2)
;=> "11101001"
(base10->n 233 8)
;=> "351"
(base10->n 233 16)
;=> "E9"

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

메서드 이름이 별로긴 한데 x진수에 해당하는 영어를 잘몰라서 ㅜㅜ

class Fixnum
  CHARS_FOR_TRANS = "0123456789ABCDEF"
  def trans_by(n)
    string, number = "", self
    loop do
      string.prepend CHARS_FOR_TRANS[number % n]
      number /= n
      break if number.zero?
    end
    string
  end
end
p 233.trans_by(16)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

NASM으로 작성해봤습니다. 입력 및 출력 모듈을 사용하기 위해 io.inc를 포함합니다.

%include "io.inc"

section .bss
_str_buffer resb 256

section .text
global _main


_main:
    mov ebp, esp
    enter 0, 0
    pusha

    GET_DEC 4, eax ; 입력 매크로: 4bytes 크기만큼 입력받아 eax에 삽입
    GET_DEC 4, ebx ; 입력 매크로: 4bytes 크기만큼 입력받아 ebx에 삽입
    mov ecx, _str_buffer
    call _trans_num

    mov ebx, eax    
    mov eax, _str_buffer
    call _rotate_buffer

    PRINT_STRING _str_buffer ; 출력 매크로: _str_buffer의 각 원소를 순회하며 '\0'문자 발견 이전까지 출력

    popa
    xor eax, eax
    leave
    ret


; summary ----------------------
; 10진수 숫자를 n진수 문자열로 변환.
; 출력 순서가 반대로 되어있기 때문에
; 각 원소 n, length - n에 대해서
; swap이 필요하다.
; ------------------------------
; input ------------------------
; eax: 10진수 변환 대상(원본 숫자)
; ebx: 변환 시킬 진수
; ecx: 변환된 값을 기록할 버퍼
; ------------------------------
; output -----------------------
; eax: 변환된 버퍼의 길이
; ------------------------------
_trans_num:
    push ecx

__tn_loop_begin:
    xor edx, edx

    ; eax / ebx의 결과
    ; eax: 몫
    ; edx: 나머지
    ; 가 기록된다.
    div ebx

    ; 10이상의 숫자에 대해선 문자로 표현해야 하므로 7만큼 추가로 더해준다.
    cmp edx, 10
    jae __tn_conv_char

__tn_continue_loop:
    ; 48만큼 더해 ASCII코드의 숫자로 변환한다.
    add dl, 30h

    mov [ecx], dl
    inc ecx

    cmp eax, 0
    jne __tn_loop_begin
    ;jmp __tn_loop_end

__tn_loop_end:
    ; 문자열이므로 맨 마지막에 '\0'를 기록한다.
    xor eax, eax
    mov [ecx], al

    mov eax, ecx
    pop ebx
    sub eax, ebx

    ret

__tn_conv_char:
    add dl, 7h
    jmp __tn_continue_loop


; summary ----------------------
; 버퍼의 각 n, length - n원소를
; swap시킨다.
; ------------------------------
; input ------------------------
; eax: 대상 버퍼
; ebx: 버퍼의 길이
; ------------------------------
_rotate_buffer:
    cmp ebx, 1
    jbe __rb_loop_end

    mov ecx, ebx
    mov ebx, eax
    add ebx, ecx
    dec ebx

__rb_loop_begin:
    movzx ecx, byte[eax]
    movzx edx, byte[ebx]
    cmp ecx, edx
    je __rb_loop_iterate

    mov [eax], dl
    mov [ebx], cl

__rb_loop_iterate:
    inc eax
    dec ebx

    cmp eax, ebx
    jnae __rb_loop_begin
    ;jmp __rb_loop_end

__rb_loop_end:
    ret
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
    Sub main()
        Dim n As Integer = Val(Console.ReadLine)
        Dim d As String = "0123456789ABCDEF"
        Dim num As Integer = 233

        Dim r As String = ""
        While num > n - 1
            Dim a As Integer = num Mod n
            r &= d(a)
            num \= n
        End While
        r &= d(num)

        Console.WriteLine("Result: " & StrReverse(r))

        Console.ReadLine()
    End Sub
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
    $num = $_GET['n'];
    for($i=0;$num>0;$i++){
        $result[$i] = $num%2;
        $num = $num/2;
    }
    for($j=$i-1;$j>=0; $j--)
    {
        echo $result[$j];
    }
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

include

void print_num(int n, int num) { if (num == 0) return; else { print_num(n, (num/n)); if ((num%n) < 10) printf("%d", (num%n)); else printf("%c", 'A'+((num%n)-10)); } }

int main() { int n, num;

printf("Scale : ");
scanf("%d", &n);
if ((n < 2) || (n > 16)) {
    printf("Error\n");
    return 0;
}
printf("Number : ");
scanf("%d", &num);

print_num(n, num);
printf("\n");
return 0;

}

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

Input Value : 233

Input Radix : 16

Output :

E9

계속하려면 아무 키나 누르십시오 . . .

스트링에 하나 씩 추가함으로써 역순 출력

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
    int radix = 0;
    int input = 0;
    printf("Input Value : ");
    scanf("%d", &input);
    printf("Input Radix : ");
    scanf("%d", &radix);
    int sum = 0;
    char out[10];
    int i = 0;
    while(input > 0) {
        if(radix > 9) {
            switch(input) {
                case 10: out[i]='A'; break;
                case 11: out[i]='B'; break;
                case 12: out[i]='C'; break;
                case 13: out[i]='D'; break;
                case 14: out[i]='E'; break;
                case 15: out[i]='F'; break;
                default:  out[i] = input%radix+48;      
            }
            i++;
            input = input / radix;
        }
        else {
            out[i] = input%radix+48;
            input = input / radix;
            i++;
        }
    }
    printf("Output : \n");
    for(int j=i-1; j>=0;j--)
        printf("%c", out[j]);
    printf("\n");
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

※ 풀이작성 안내
  • 본문에 코드를 삽입할 경우 에디터 우측 상단의 "코드삽입" 버튼을 이용 해 주세요.
  • 마크다운 문법으로 본문을 작성 해 주세요.
  • 풀이를 읽는 사람들을 위하여 풀이에 대한 설명도 부탁드려요. (아이디어나 사용한 알고리즘 또는 참고한 자료등)
  • 작성한 풀이는 다른 사람(빨간띠 이상)에 의해서 내용이 개선될 수 있습니다.
목록으로
코딩도장

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.

stack x 2
연관 문제

언어별 풀이 현황
전 체 x 83
java x 17
scala x 2
python x 37
javascript x 2
perl x 1
cpp x 12
기 타 x 7
cs x 3
objectivec x 1
ruby x 1