본문 바로가기

개발자/C

C언어 진법변환

반응형

문제


요구분석

1.첫줄에는 N(2<=N<=16)을 입력받는다

2.두번째줄과 세 번째 줄에는 각각 N진수의 수를 입력받는다.

3.입력된 두 수의 합을 10진수로 나타냈을 때 21억을 넘지 않아야 하며 10이상의 수는 순서대로 ABCDEF로 나타낸다.

4.출력값은 첫 번째 줄에 10진수로 두 번째 줄에 N진수로 출력한다.

 

해결방법

입력받은 N진수의 두 수를 10진수로 변환하여 합한 뒤, 합을 출력하고 다시 N진수로 변환하여 출력하는 방법

 

배경지식

1.strtol() 함수

=>입력받은 문자열을 해당 진수의 숫자로 변환해주는 함수

strtol(a,NULL,n) // a문자열을 n진수로 변형함

 

2.진수 변환하는 방법

while(i<=sum)

i=i*n;

while(true){

i=i/n;

quo=sum/i;

rem=sum%i;

if(i!=1){

sum=rem;

}else

{

break;

}

}

 

알고리즘

진수를 저장할 n, 합을 저장할 sum을 선언

char형 배열 a,b를 선언하여 사용자에게 각각의 값을 입력받음

진수값이 2보다 작거나 16보다 클 경우 에러 출력, 종료

입력받은 각각의 수를 strtol함수를 사용하여 10진수로 바꾼뒤 더한값을 sum에 저장

더한값 sum21억보다 크면 에러 출력, 종료

합을 10진수로 출력

convert함수에 진수와 합을 입력

while문을 통해 입력된 진수로 합의 값을 변환시키고 완료시 출력

 

소스코드

#include <stdio.h>

#include <stdlib.h>

void convert(int n,int sum)

{

printf("%d진수 : ",n);

char a[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };      

int i = 1;     

int quo,rem;

while(i<=sum)

i=i*n;      

while(true){

i=i/n;

quo=sum/i;

rem=sum%i;

printf("%c",a[quo]);

if(i!=1){

sum=rem;            

}else

{

break;            

}

}

printf("\n");

}

void main(){

int n,sum=0;

char a[100],b[100];

scanf("%d %s %s",&n,&a,&b);


if(n>16 ||n<2){

printf("wrong input n value\n");

exit(0);

}

sum = (strtol(a,NULL,n) + strtol(b,NULL,n));

if(sum>2100000000){

printf("sum값이 21억 초과\n");

exit(0);

}

printf("십진수 : %d\n",sum);

convert(n,sum);}

 

실행결과



반응형