문제
요구분석
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에 저장
더한값 sum이 21억보다 크면 에러 출력, 종료
합을 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);}
실행결과
'개발자 > C' 카테고리의 다른 글
visual studio scanf 에러, scanf_s 사용 (0) | 2015.10.08 |
---|---|
C언어 숫자 5개 입력받아 세자리수 만들기 (0) | 2015.09.29 |
C언어 대시 수 세기 (0) | 2015.09.29 |
C언어 초침과 분침이 직각을 이룰때 시각 구하기 (0) | 2015.09.29 |
C언어 소수놀이, 소수구하기 (0) | 2015.09.29 |