C 언어로 "이상한 나라의 셈법"
추천글 : 【C 언어】 C 언어 목차
Q. 어떤 나라에서는 이진법을 사용한다. 그런데 그 나라의 사람들은 0이 연속적으로 붙는 수를 싫어한다. 숫자를 셀 때도 0이 연속적으로 붙는 수를 싫어한다. 그래서 다른 나라와 무역을 할 때 어려움이 따른다. 이 나라의 왕은 이 문제를 해결하기 위해 자기 나라 숫자를 십진법으로 바꾸는 프로그램을 만들려고 한다. 왕을 도와 프로그램을 작성하여라. (ref)
입력
이 왕국에서 사용하는 수 n을 입력한다. (이때 입력되는 것은 이진법이고, 0이 연속적으로 붙는 수는 없다.) (1 ≤ n ≤ 221)
참고 : 1 → 1, 10 → 2, 11 → 3, 101 → 4, 110 → 5, 111 → 6, 1010 → 7
출력
n을 십진법으로 출력한다.
#include <stdio.h>
#include <stdlib.h>
int Converting(char *array, int *Fibo, int array_size){
if(array_size <= 3){
if(array_size == 1) return 1;
if(array_size == 2) return 2 + array[1];
return 2*array[1] + array[2] + 3;
}
if(array[1] == 0){ // 101…
char array_2[array_size - 2];
int i;
for(i=2; i<array_size; i++){
array_2[i-2] = array[i];
}
return Fibo[array_size-1] + 1 + Converting(array_2, Fibo, array_size - 2);
/* Fibo[array_size] - 1 + Converting(array_2, Fibo, array_size - 2) - (Fibo(array_size - 2) - 1) */
}
else if(array[2] == 0){ // 110…
char array_2[array_size - 3];
int i;
for(i=3; i<array_size; i++){
array_2[i-3] = array[i];
}
return Fibo[array_size] + 1 + Converting(array_2, Fibo, array_size - 3);
/* Fibo[array_size] - 1 + Fibo[array_size - 1] - Fibo[array_size - 2] +
Converting(array_2, Fibo, array_size - 3) - (Fibo(array_size - 3) - 1) */
}
else{ // 111…
char array_2[array_size - 2];
int i;
for(i=2; i<array_size; i++){
array_2[i-2] = array[i];
}
return Fibo[array_size] + 1 + Converting(array_2, Fibo, array_size - 2);
/* Fibo[array_size] - 1 + Fibo[array_size - 1] - Fibo[array_size - 2] + Fibo[array_size - 2] -
Fibo[array_size - 3] + Converting(array_2, Fibo, array_size - 2) - (Fibo(array_size - 2) - 1) */
}
}
int main(int argc, char *argv[]) {
char array[23];
int Fibo[23];
int i; char ch;
Fibo[1] = 1;
Fibo[2] = 2;
for(i = 3; i <= 22; i++){ // Fibo[i] equals 1010…(2) (size: i) (귀납적으로 증명)
Fibo[i] = Fibo[i-1] + Fibo[i-2] + 1;
}
i = 0;
while(1){
ch = getchar();
if(ch < 30) break;
array[i] = ch - '0';
i ++;
}
printf("%d", Converting(array, Fibo, i));
return 0;
}
입력 : 2016.02.16 11:31
'▶ 자연과학 > ▷ C, C++' 카테고리의 다른 글
【코딩】 C 언어로 연속수 (0) | 2016.06.27 |
---|---|
【코딩】 C 언어로 소인수분해 (Integer Factorization) (0) | 2016.06.27 |
【코딩】 C 언어로 진법변환 (10진법 → n진법) (0) | 2016.06.27 |
【코딩】 C 언어로 계산기(+, -, ×, ÷) 구현하기 (0) | 2016.06.27 |
【코딩】 C 언어로 n 이하의 소수, 에라토스테네스의 체 (0) | 2016.06.27 |
최근댓글