Advertisement
Guest User

Untitled

a guest
Nov 17th, 2019
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.77 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4. #define N 14
  5.  
  6. unsigned long long int InTen (int len, int b1, char num[], int dot){
  7.     int i = 0, n = 0;
  8.     long long ten = 0;
  9.     if (dot == -1)
  10.         for (i = 0 ; i < len; i++) {
  11.             if (num[i] >= '0' && num[i] <= '9') n = num[i] - '0';
  12.             if (num[i] >= 'A' && num[i] <= 'F') n = num[i] - 'A' + 10;
  13.             ten = ten * b1 + n;
  14.         }
  15.     else
  16.         for (i = 0; i < dot; i++){
  17.             if (num[i] >= '0' && num[i] <= '9') n = num[i] - '0';
  18.             if (num[i] >= 'A' && num[i] <= 'F') n = num[i] - 'A' + 10;
  19.             ten = ten * b1 + n;
  20.         }
  21.     return ten;
  22. }
  23.  
  24. void OutTen (long long ten, int b2){
  25.     char st[49];
  26.     int i=0;
  27.     while (ten >= b2) {
  28.         if (ten % b2 <= 9) st[i] = ten % b2 + '0';
  29.         if (ten % b2 >= 10 && ten % b2 <= 15) st[i] = ten % b2 - 10 + 'A';
  30.         ten /= b2;
  31.         i++;
  32.     }
  33.     if (ten < 10) st[i] = ten + '0';
  34.     if (ten > 9 && ten < 16) st[i] = ten + 'A' - 10;
  35.     for (; i>=0; i--) printf("%c", st[i]);
  36. }
  37.  
  38. double InTenDot(int len, char num[], int dot, int b1){
  39.     int i;
  40.     int digit =0;
  41.     double ten_float = 0;
  42.     for (i = len - 1; i > dot; i--){
  43.         if (num[i] >= '0' && num[i] <= '9') digit = num[i] - '0';
  44.         if (num[i] >= 'A' && num[i] <= 'F') digit = num[i] - 'A' + 10;
  45.         ten_float = (ten_float + digit) / b1;
  46.     }
  47.     return ten_float;
  48. }
  49.  
  50. void OutTenDot (double ten_float, int b2){
  51.     int i, k = 0;
  52.     char st[12];
  53.     for (i = 0; i < 12; i++){
  54.         int digit = ten_float * b2;
  55.         if (digit >= 0 && digit <= 9) st[i] = digit + '0';
  56.         if (digit >= 10 && digit <= 15) st[i] = digit - 10 + 'A';
  57.         ten_float = ten_float * b2 - digit;
  58.         if (ten_float != 0 && i != 11) k++;
  59.     }
  60.     printf(".");
  61.     for (i = 0; i <= k; i++) printf("%c", st[i]);
  62. }
  63.  
  64. int main() {
  65.     int b1,b2, dot=-1, i=0, j=0;
  66.     char num[N];
  67.     if (scanf("%d %d %13s",&b1, &b2, num)==1){ }
  68.     if ((b1 > 16) || (b1 < 2) || (b2 < 2) || (b2 > 16)) {
  69.         puts("bad input");
  70.         return 0;
  71.     }
  72.     int len = strlen(num);
  73.     for (i=0; i<len; i++){
  74.         num[i]=toupper(num[i]);
  75.     }
  76.     char el[17] = "0123456789ABCDEF";
  77.     for (i=0; i<len; i++){
  78.         for (j=0; j<b1; j++){
  79.             if (num[i]== el[j])
  80.                 break;
  81.             if (num[i]=='.' && dot==-1){
  82.                 dot=i;
  83.                 break;
  84.             }
  85.             if (j==(b1-1)){
  86.                 puts("bad input");
  87.                 return 0;
  88.             }
  89.         }
  90.     }
  91.     if (dot == 0 || len == dot + 1) {
  92.         puts("bad input");
  93.         return 0;
  94.     }
  95.         OutTen(InTen(len, b1, num, dot), b2);
  96.         OutTenDot(InTenDot(len, num, dot, b1), b2);
  97.     return 0;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement