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

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

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

예)

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

83개의 풀이가 있습니다. 1 / 9 Page

재귀로 풀어 보았습니다.

def convert(n, base):
    T = "0123456789ABCDEF"
    q, r = divmod(n, base)
    if q == 0:
        return T[r]
    else:
        return convert(q, base) + T[r]


print convert(233, 2)
print convert(233, 8)
print convert(233, 16)
깔끔하네요. 재귀를 이렇게 활용이 되는 군요. - Shin gil sang, 2015/11/17 16:11 M D
저도 재귀로 풀었지만, 훨씬 더 깔끔하네요. 함수에 문자를 더하고 리턴하는법 배우고 갑니다^^ - 디디, 2016/03/21 23:38 M D
divmod 펑션과 리턴하는법 배우고갑니다 ^^ - Kim Soojong, 2016/12/05 09:15 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

C#으로 작성했습니다. 재귀함수로 더 이상 나누어 떨어질 수 없을 때까지의 나머지 값을 string으로 묶었습니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CodingDojang
{

    class CodingDojang
    {
        static void Main(string[] args)
        {
            DecimalConverter.Answer();
            Console.Read();
        }
    }

    public static class DecimalConverter
    {

        public static void Answer()
        {
            Console.WriteLine("Please type a decimal number: ");
            int number = int.Parse(Console.ReadLine());
            Console.WriteLine("Please type a form to convert: ");
            int convert = int.Parse(Console.ReadLine());

            string solution = string.Empty;

            solution = Division(number, convert, solution);

            Console.WriteLine(solution);
        }

        public static string Division(int number, int convert, string solution)
        {
            int remainder = number % convert;

            solution = ConvertToSymbol(remainder) + solution;
            number = number / convert;

            if (number > convert)
                solution = Division(number, convert, solution);
            else
                solution = ConvertToSymbol(number) + solution;

            return solution;

        }

        public static string ConvertToSymbol(int remainder)
        {
            if (remainder < 10)
                return remainder.ToString();
            else
            {
                switch (remainder)
                {
                    case 10: return "A"; break;
                    case 11: return "B"; break;
                    case 12: return "C"; break;
                    case 13: return "D"; break;
                    case 14: return "E"; break;
                    case 15: return "F"; break;
                }
            }

            return string.Empty;
        }

        public string ConvertToBaseNumber(int value, int n)
        {
            if (n == 2) return IntToString(value, new [] {'0', '1'});
            if (n == 16)
                return IntToString(value,
                    new[] {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'});
            if (n == 26)
                return IntToString(value, Enumerable.Range('A', 26).Select(x => (char) x).ToArray());
            if (n == 60)
                return IntToString(value,
                    new[]
                    {
                        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
                        'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c',
                        'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
                        'w', 'x', 'y', 'z'
                    });
            return string.Empty;
        }

        public string IntToString(int value, char[] bases)
        {
            var result = string.Empty;
            var targeted = bases.Length;
            do
            {
                result = bases[value%targeted] + result;
                value /= targeted;
            } while (value > 0);
            return result;
        }

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

파이썬으로 풀어봤습니다.

# num -> 바꿀 숫자, t -> 진수 타입(2, 8, 16 등)
def transNum(num, t):

    tNum = ''

    # 정수형태의 최소값이 나올 때까지 진행
    while 1 <= num:
        modNum = num % t

        if 9 < modNum:  # 나머지가 9자리를 초과할 경우 캐릭터형태로 변환
            tNum = str(unichr(ord('a') + modNum - 10)) + tNum
        else:
            tNum = str(modNum) + tNum
        num = num / t

    return tNum
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def baseN(num,b,numerals="0123456789abcdefghijklmnopqrstuvwxyz"):
    return ((num == 0) and numerals[0]) or (baseN(num // b, b, numerals).lstrip(numerals[0]) + numerals[num % b])
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#coding: CP949
k=int(input('변환하려는 수를 입력하여라:'))
n=int(input('몇진수로 표현하려는가(1이상 16이하)?:'))
table={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,
10:'A', 11:'B',12:'C',13:'D',14:'E',15:'F'} # n이 11~16일 경우 table 사용.
data=[]
if n <=10:
    while k !=0:
        p=divmod(k,n)[1]
        data.append(p)
        k=divmod(k,n)[0]
    data.reverse()
    result=""
    for i in data:
        result+=str(i)
    print(result)
elif n>10 and n<=16:
    while k != 0:
        p=divmod(k,n)[1]
        data.append(table[p])
        k=divmod(k,n)[0]
    data.reverse()
    result=""
    for i in data:
        result+=str(i)
    print(result)
else:
    print('잘못된 입력입니다.')

파이썬 3.4
저처럼 for i in range(0, len(data))를 를 하는 대신 for i in data를 쓰면 간결하군요. divmod함수도 배워갑니다. - 최승호, 2016/07/14 18:44 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
n=233
j=16

o=''
while n:
    n,m=divmod(n,j)
    o=(str(m) if m<10 else 'ABCDEF'[m-10])+o
print(o)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def toN(n, num=2):
    res=[]
    res2=''
    while n>0:
       n, tmp = divmod(n, num)
       res.append((str(tmp) if tmp <10 else 'ABCDEF'[tmp-10]))

    for i in range(len(res)):
        res2 += res.pop()

    return res2

print(toN(233, 2))
print(toN(233, 8))
print(toN(233, 16))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

자바로 간단히 풀어보았습니다

package java_test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


/*
 * 자바에서 제공되는 메서드가 아닌 사용자 정의 진법 변환 메서드를 만드는 예제입니다.10진수를 입력 받아 2진수, 8진수 16진수로 반환하는 프로그램 입니다.
 */
public class test_2 {
    public static void main(String[] args) throws IOException{

        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("구할 숫자를 입력하세요");
        String value = in.readLine();

        for(int i=2; i<=16; i++){
            String strNum = toDeposition(Integer.parseInt(value), i);
            System.out.println(value + "의 "+i+" 진법: "+ strNum + "<br>");
        }

    }       


    public static String toDeposition(int value, int i){

        String returnString = "";
        String temp = "";


        while(value != 0){

            // 나머지가 0~9 사이이면  캐릭터 값을 배열에 저장
            if( (value % i) < 10 ) {
                //문자열 우->좌로 배열
                returnString = (value % i) + returnString;
                //몫을 구함
                value /= i;
            }
            // 나머지가 10 이상이면 해당하는 값의 알파벳을 저장
            else {
                int temp1 = (char)((value % i)  + 55);

                returnString = Integer.toString(temp1) + returnString;
            }

        }

        return returnString;

    }

}

결과]]] 구할 숫자를 입력하세요 233 233의 2 진법: 11101001
233의 3 진법: 22122
233의 4 진법: 3221
233의 5 진법: 1413
233의 6 진법: 1025
233의 7 진법: 452
233의 8 진법: 351
233의 9 진법: 278
233의 10 진법: 233
233의 11 진법: 1A2
233의 12 진법: 175
233의 13 진법: 14C
233의 14 진법: 129
233의 15 진법: 108
233의 16 진법: E9

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
public class SimpleDecimalConversion {
    private String result = "";
    private String[] tmp = {"A","B","C","D","E","F"};

    public static void main(String[] args) {
        SimpleDecimalConversion sdc = new SimpleDecimalConversion();
        sdc.getRemainder(233, 2);
        sdc.getRemainder(233, 8);
        sdc.getRemainder(233, 16);
    }

    public void getRemainder(int t, int v) {
        if (t == 0 || v == 0) {
            return;
        }
        int mod = (t % v);

        if (mod >= 10) {

            result = tmp[mod%10] + result;
        } else {
            result = mod + result;
        }

        int tv =  t/v;

        if (tv >= v) {
            getRemainder(tv,v);
        } else {

            if (tv >= 10) {
                System.out.println(tmp[tv%10]+result);
            } else {
                System.out.println(tv+result);
            }

            result = "";
        }
    }


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

간단하게 c++로 플어봤습니다.


풀이

int main(){

    int input,i=0,div,res;
    int a[1000];

    printf("\n원하는 10진수를 입력하세요 : ");
    scanf("%d",&input);
    div=input/2;
    res=input%2;
    a[i]=res;//처음은 input받아서 2로 나눈 나머지값을 a[0]에 넣는다. 

    printf("\n입력하신 %d의 8진수 값: %#o",input,input);//8진수값 출력 oXXX형태로..
    printf("\n입력하신 %d의 16진수 값: %#x",input,input);//16진수값 출력 oxXXX형태로..

    while(1){
        if(div==0) break;
        else { 
               i++;
               res=div%2;
               div=div/2;
               a[i]=res;        }
    }//a[1]부터 계속 나머지값 입력, 단2로 나눈 몫이 0될때까지..

    printf("\n입력하신 %d의 2진수 값: ",input);

    for(i;i>=0;i--){
    printf("%d",a[i]);
     }//a[i]부터 a[0]까지 역순으로 프린터..

     printf("\n");

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

풀이 작성

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

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(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