#include <stdio.h>
#include <stdlib.h>
#define FULL_ARR_SIZE 13
#define DIGIT_ARR_SIZE 12
#define ERROR_TEXT "bad input"
#define ASSCI_TO_DIGIT 48
#define ASSCI_TO_SMALL_LET 87
#define ASSCI_TO_CAP_LET 55
/*
целые числа b1 и b2 от 2 до 16 -- основание исходной и конечной с.с.***********
b1-ричная запись числа X -- от 1 до 12 b1-ричных цифр, возможно разделенных точкой на целую и дробную часть, всего не более 13 символов. *********
Если b1 и b2 в первой строке не от 2 до 16, то "bad input". **********
Если в второй строке не b1-ричная запись, то "bad input".
Иначе -- запись всей целой части X в b2-ричной с.с.
и если X содержит дробную часть, то точка и первые 12 b2-ричных цифр дробной части.
Размер исполняемого файла + размер данных < 4Mb
*/
short scanf_bb();
short int_part();
short fra_part();
short main(){
short b1, b2;
short input_i_part[FULL_ARR_SIZE];
short input_f_part[FULL_ARR_SIZE];
//char int_in_10[];
if (scanf_bb(&b1, &b2)){
return EXIT_SUCCESS; //конец в б1б2 - конец
}
short output_int_part = int_part(input_i_part, &b1);
if (output_int_part == 1){
return EXIT_SUCCESS; //конец в целой - конец
}
else if (output_int_part == 2){
short output_frac = fra_part(input_f_part, &b1);
if (output_frac == 1) {
return EXIT_SUCCESS;
}
}
for(int i = 0; input_i_part[i] != EOF; i++){
printf("%d", input_i_part
[i
]); }
for(int i = 0; input_f_part[i] != EOF; i++){
printf("%d", input_f_part
[i
]); }
return EXIT_SUCCESS;
}
short scanf_bb(short* b1, short* b2){
if ((scanf("%hd%hd", b1
, b2
)) != 2 || (*b1
< 2) || (*b1
> 16) || (*b2
< 2) || (*b2
> 16)) return 1; //числа вне диапазона
else return 0;
}
short int_part(short input_i_part[], short* b1){
char this_digit = 0;
short output = 0;
for (int i = 0; (i < DIGIT_ARR_SIZE) && (this_digit != '\n'); i++){
if ((*b1 <= 10) && (this_digit >= '0') && (this_digit <= '9')){
input_i_part[i] = this_digit - ASSCI_TO_DIGIT;
if (input_i_part[i] >= *b1) return 1;
}
else if ((*b1 <= 16) && (this_digit >= 'a') && (this_digit <= 'f')){
input_i_part[i] = this_digit - ASSCI_TO_SMALL_LET;
if (input_i_part[i] >= *b1) return 1;
}
else if ((*b1 <= 16) && (this_digit >= 'A') && (this_digit <= 'F')){
input_i_part[i] = this_digit - ASSCI_TO_CAP_LET;
if (input_i_part[i] >= *b1) return 1;
}
else if (this_digit == '.'){
if (i == 0)
return output + 1;
else {
output += 2;
break;
}
}
else return output + 1; //введен не допустимый символ - конец
}
input_i_part[FULL_ARR_SIZE - 1] = EOF;
return output;
}
short fra_part(short input_f_part[], short* b1){
char this_digit;
for (int i = 0; (i < DIGIT_ARR_SIZE) || (this_digit != '\n'); i++){
if ((this_digit
= getchar()) == 1){
if ((*b1 <= 16) && (this_digit >= '0') && (this_digit <= '9'))
input_f_part[i] = this_digit - ASSCI_TO_DIGIT;
if (input_f_part[i] >= *b1) return 1;
else if ((*b1 <= 16) && (this_digit >= 'a') && (this_digit <= 'f'))
input_f_part[i] = this_digit - ASSCI_TO_SMALL_LET;
if (input_f_part[i] >= *b1) return 1;
else if ((*b1 <= 16) && (this_digit >= 'A') && (this_digit <= 'F'))
input_f_part[i] = this_digit - ASSCI_TO_CAP_LET;
if (input_f_part[i] >= *b1) return 1;
else return 1; //введен недопустимый символ - конец
}
else return 1; //не распознан символ - конец
}
input_f_part[FULL_ARR_SIZE - 1] = EOF;
}
int ib1_to_10(char int_in_10[], const short* input_i_part, int* b1){
}