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

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

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

예)

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

15개의 풀이가 있습니다. 1 / 2 Page

간단하게 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;
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

C로 풀어보았습니다.

#include <stdio.h>


int find_digit (int *digit_pnt, int value, int n) {

    if(value==0) {
        return 0;
    }
    else {
        (*digit_pnt)++;
        return find_digit(digit_pnt, value/n, n);
    }
}

int convert_value (int *top_pnt, int *result_stack, int value, int n) {

    if(value==0) {
        return 0;
    }
    else {
        result_stack[(*top_pnt)] = value%n;
        (*top_pnt)++;
        return convert_value(top_pnt, result_stack, value/n, n);
    }

}

int main() {

    int option;

    int value, n, i;

    int top;
    int digit;

    int *result_stack;


    while(1) {

        do{
            printf("1:프로그램 (재)실행, 2:프로그램 종료 :");
            scanf("%d", &option);
        }while(option!=1 && option!=2);

        switch(option){
            case 1:
                top=0;
                digit=1;

                do{
                    printf("변환할 양의 정수를 입력 : ");
                    scanf("%d", &value);
                }while(value<=0);

                do{
                    printf("(n)진법 입력(2<=n<=16) : ");
                    scanf("%d", &n);
                }while(n<2 || n>16);

                find_digit(&digit, value, n);

                result_stack = (int*)malloc(sizeof(int)*digit);

                convert_value(&top, result_stack, value, n);

                for(i=(top-1);i>=0;i--){
                    printf("%x", result_stack[i]);
                }

                printf("\n");

                break;

            case 2:
                return 0;
        }
    }

}


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

c++입니다.

#include <iostream>

long transform(int, int);

using namespace std;

int main(int argc, const char * argv[]) {
    // insert code here...
    cout<<transform(123, 2)<<endl;
    cout<<transform(123, 8)<<endl;
    cout<<transform(123, 16)<<endl;
    return 0;
}

long transform(int number, int n) {
    if(n < 2 || n > 16) return 0;

    int result = 0;
    number*=n;
    for(int count = 1; number/=n; count*=10) result += (number%n)*count;

    return result;
}

결과

1111011
173
81
Program ended with exit code: 0
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

C로 풀어보았습니다.

#include <stdio.h>

void convert( int, int );

int main(int argc, char ** argv[])
{
    // 인자를 제대로 입력하지 않은 경우 사용법을 출력하고 종료한다.
    if( argc < 3 )
    {
        printf("usage : convert decimal n(진법)\n");
        return 0;
    }

    if( atoi(argv[2]) > 16 || atoi(argv[2]) < 2 )
    {
        printf("2 ~ 16진법을 입력해주세요\n");
        return 0; 
    }

    int decimal = atoi(argv[1]);
    printf("10진수 : %d\n", decimal); 
    printf("%d진수 : ", atoi(argv[2]) );  
    convert( decimal, atoi(argv[2]) );
    return 0;
}

// decimal을 n진수로 변환하여 출력한다.
void convert(int decimal, int n)
{
    int remain;         /* 각 자리별 나머지 */
    int idx = 0;        /* 변환된 문자가 저장될 배열의 인덱스 */
    char result[512];   /* 변환된 문자열이 저장될 배열 */
    int i;

    do
    {
        // n 으로 나눈 나머지를 구한다.
        remain = decimal % n;

        // Step 1. 나머지가 9보다 크면 'A'부터 시작한다.
        if( remain > 9 )
        {
            remain -= 10;
            remain += 'A';
        }
        // Step 2. 나머지가 10보다 작으면 '0'부터 시작한다.
        else
            remain += '0';

        // 각 자리의 나머지를 배열에 저장한다.
        result[idx++] = remain;

        // 몫을 취한다.
        decimal /= n;
    } while( decimal > 0 ); /*decimal(몫)이 0이 될 때 까지 반복 */

    // 배열을 역순으로 출력한다.
    for(i = idx; i >= 0; i--)
        printf("%c", result[i]);
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

간단히 만들었습니다.

char str[17] = "0123456789ABCDEF";

void myconv(int in, int n)
{
    int q = in / n;
    int r = in % n;

    if(q == 0)
    {
        printf("%c",str[r]);
        return; 
    }

    myconv(q,n);
    printf("%c",str[r]);
};
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#define _CRT_SECURE_NO_WARNINGS

#include <windows.h>
#include <stdio.h>

#define max 256


int main(void) {
    int ascii[16] = { 48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70 };
    //0~9,,A~F
    int rst[max] = { 0, };
    int m, n, i=0;
    printf("10진수 수 입력 = ");
    scanf("%d", &m);
    printf("바꿀 n진수 입력 = ");
    scanf("%d", &n);
    printf("10진수 : %d ------> %d진수 : ", m, n);

    while (m) {
        rst[i++] = ascii[m%n];
        m = m / n;
    }
    for (i; i > 0; i--) {
        printf("%c", rst[i-1]);
    }
    printf("\n");


    system("pause");
}

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#include<iostream>
#include<stdio.h>
using namespace std;

int main()
{
    int div, num;
    int arr[100];
    int temp;
    int i;

    cout << "10진수가 아닌 다른 진수로 나타내고 싶은 숫자를 입력하세요 : ";
    cin >> num;
    temp = num;
    cout << "2~16사이에 위의 수를 10진수가 아닌 다른 진수로 나타내고 싶은 것을 쓰시오 : ";
    cin >> div;

    for (i = 0;i < 100;i++)
        arr[i] = 20;

    if (div < 10)
    {
        while (temp >= div)
        {
            arr[0] = temp % div;

            for (i = 1;temp>=1;i++)
            {
                    temp = temp / div;
                    arr[i] = temp % div;
            }
        }
        cout << num << "을 " << div << "진수로 나타낸 결과는 ";

        for ( i = 99 ; i>=0 ; i-- )
        {
            if (arr[i] == 20)
                ;
            else
            {
                cout << arr[i];
            }
        }
    }

    else if (div == 10)
    {
        cout << num;
    }

    else if (div > 10 && div <= 16)
    {
        int arr2[200];

        for (int i = 0;i < 200;i++)
            arr2[i] = 20;

        while (temp >= div)
        {
            for (i = 0;i<=temp;i++)
            {
                arr2[i] = temp%div;
                temp = temp / div;
            }
        //  arr[i] = temp%div;
        }
        cout << num << "을 " << div << "진수로 나타낸 결과는 ";

        for (i = 199;i >= 0;i--)
        {
            if (arr2[i] != 20)
            {//cout << arr2[i];
                if (arr2[i] >= 10)
                {
                    if (arr2[i] == 10)
                        cout << 'a';
                    else if (arr2[i] == 11)
                        cout << 'b';
                    else if (arr2[i] == 12)
                        cout << 'c';
                    else if (arr2[i] == 13)
                        cout << 'd';
                    else if (arr2[i] == 14)
                        cout << 'e';
                    else if (arr2[i] == 15)
                        cout << 'f';
                }
                else
                    cout << arr2[i];
            }
        }
        cout << endl;
    }

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

안녕하세요. C++로 구현했습니다.

스택구조를 보고 재귀함수 사용했습니다.

#include<iostream>
#include<string>
using namespace std;

void cvtNum(int num, int n)
{
    int rem = num%n;
    num /= n;

    if(num != 0)
        cvtNum(num,n);

    if(rem >9)
        cout<<(char)(rem+55);
    else
        cout<<rem;
}

void main()
{
    cout<<"Hello Stranger??"<<endl;

    int num =0;
    int n =0;

    cout<<"숫자를 입력하시오."<<endl;
    cin>>num;
    cout<<"n을 입력하시오."<<endl;
    cin>>n;

    cvtNum(num,n);

}


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

C(11) gcc -std=c11

#include <stdio.h>
#include <assert.h>

// n을 k진수로 변환, k범위[2, 16]
void convt(int n, int k);

int main(void)
{
    int n, k;

    while (scanf("%d %d", &n, &k) == 2)
    {
        assert(2 <= k && k <= 16);
        convt(n, k);
        putchar('\n');
    }

    return 0;
}

void convt(int n, int k)
{
    static const char *code = "0123456789ABCDEF";

    if (n / k == 0) ;
    else convt(n / k, k);

    putchar(code[n % k]);
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#include<stdio.h>
#include<windows.h>
#define MAX 10
int main()
{
    int a,i,b=233,count=0,c[MAX];

    printf("몇진수로 구하겠습니까?\n");
    scanf("%d",&a);
    while(1)
    {
        c[count]=b%a;
        b=(int)b/a;
        if(b==0) break;
        count++;
            }
    for(i=0;i<=count;i++)
        printf("%d",c[count-i]);
    system("pause");
    return 0;
}

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

풀이 작성

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

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

stack x 2
연관 문제

언어별 풀이 현황
전 체 x 108
python x 51
cs x 4
java x 21
cpp x 15
objectivec x 1
기 타 x 9
scala x 2
perl x 1
javascript x 3
ruby x 1