Advertisement
Guest User

lab0

a guest
Dec 11th, 2019
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.68 KB | None | 0 0
  1.  
  2. #include<stdlib.h>
  3. #include <ctype.h>
  4. #include <string.h>
  5. #include <stdio.h>
  6.  
  7. int proverka(int b1, int b2, char *num1) {
  8.     //проверка систем счисления
  9.     if (b1 > 16 || b1 < 2 || b2>16 || b2 < 2) {
  10.         printf("bad input");
  11.         return 0;
  12.     }
  13.     //нахождение индекса точки
  14.     int p1 = 0;
  15.     int tochka = -1;
  16.     int dlina = 0;
  17.     for (int i = 0; num1[i] != '\0'; i++) {
  18.         num1[i] = tolower(num1[i]);
  19.         dlina++;
  20.         if (num1[i] == '.') {
  21.             //проверка, что точка одна
  22.             if (p1 == 1) {
  23.                 printf("bad input");
  24.                 return 1;
  25.             }
  26.             tochka = i;
  27.             p1 = 1;
  28.         }
  29.         //проверка, что точка не на первом  месте
  30.         if (tochka == 0) {
  31.             printf("bad input");
  32.             return 1;
  33.         }
  34.  
  35.         //проверка введенного числа
  36.         if (num1[i] != '.' && (num1[i] - '0' < 10 && (num1[i] - '0' > b1 - 1 || num1[i] - '0' < 0))) {
  37.             printf("bad input");
  38.             return 1;
  39.         }
  40.         if (num1[i] != '.' && (num1[i] - '0' > 10 && (num1[i] - 'a' + 10 > b1 - 1 || num1[i] - 'a' + 10 < 10))) {
  41.             printf("bad input");
  42.             return 1;
  43.         }
  44.     }
  45.  
  46.     //проверка, что точка стоит не на последнем месте
  47.     if (tochka == dlina - 1) {
  48.         printf("bad input");
  49.         return 1;
  50.     }
  51.     return 0;
  52. }
  53.  
  54. char perev(int b1, int b2, char* num1, char* num2) {
  55.     //нахождение индекса точки
  56.     int p1 = 0;
  57.     int tochka = -1;
  58.     int dlina = 0;
  59.     for (int i = 0; num1[i] != '\0'; i++) {
  60.         num1[i] = tolower(num1[i]);
  61.         dlina++;
  62.         if (num1[i] == '.') {
  63.             tochka = i;
  64.             p1 = 1;
  65.         }
  66.     }
  67.  
  68.         //если системы счисления равны, вывести число
  69.         if (b1 == b2) {
  70.             printf("%s", num1);
  71.             return 0;
  72.         }
  73.  
  74.         if (tochka == -1) tochka = dlina;
  75.  
  76.         unsigned long long dot = 0;
  77.         double poslt = 0, b1pow = 1;
  78.  
  79.         //Переводим в десятичную cc до точки
  80.         for (int i = tochka - 1; i >= 0; i--) {
  81.             if (num1[i] - '0' < 10) {
  82.                 dot += (num1[i] - '0') * (unsigned long long)b1pow;
  83.             }
  84.             else {
  85.                 dot += (num1[i] - 'a' + 10) * (unsigned long long)b1pow;
  86.             }
  87.             b1pow *= b1;
  88.         }
  89.         b1 = 1.0 / b1;
  90.  
  91.         //Переводим в десятичную часть после точки
  92.         for (int i = tochka + 1; i <= dlina; i++) {
  93.             if (num1[i] - '0' < 10) {
  94.                 poslt += (num1[i] - '0') * (unsigned long long)b1pow;
  95.             }
  96.             else {
  97.                 poslt += (num1[i] - 'a' + 10) * (unsigned long long)b1pow;
  98.             }
  99.             b1pow *= b1;
  100.         }
  101.  
  102.         int num3[100];
  103.         dlina = 0;
  104.  
  105.         if (dot == 0) {
  106.             num3[0] = 0;
  107.             dlina = 1;
  108.         }
  109.  
  110.         //Переводим в b2-ичную часть до точки
  111.         for (int i = 0; dot > 0; i++) {
  112.             num3[i] = dot % b2;
  113.             dlina++;
  114.             dot /= b2;
  115.         }
  116.  
  117.         //Делаем разворот и переводим в char часть до точки
  118.         for (int i = 0; i < dlina; i++) {
  119.             if (num3[dlina - i - 1] < 10) {
  120.                 num2[i] = num3[dlina - i - 1] - '0';
  121.             }
  122.             else {
  123.                 num2[i] = num3[dlina - i - 1] - 'a' + 10;
  124.             }
  125.         }
  126.  
  127.         if (p1 != 1 || poslt == 0.0) {
  128.             num2[dlina] = '\0';
  129.             return 0;
  130.         }
  131.         num2[dlina] = '.';
  132.         //Переводим в b2-ичную часть после точки
  133.         for (int i = dlina + 1; i < dlina + 13; i++) {
  134.             poslt *= b2;
  135.             num3[i] = (int)poslt;
  136.             poslt -= (int)poslt;
  137.             if (num3[i] < 10) {
  138.                 num2[i] = num3[i] - '0';
  139.             }
  140.             else {
  141.                 num2[i] = num3[i] + 10 - 'a';
  142.             }
  143.         }
  144.         num2[dlina + 13] = '\0';
  145.         return 0;
  146.    
  147. }
  148.  
  149. int main() {
  150.     int b1, b2;
  151.     scanf_s("%d%d", &b1, &b2);
  152.     char num1[20];
  153.     scanf_s("%13s", num1, sizeof(num1));
  154.     char num2[100];
  155.     int a = proverka(b1, b2, num1);
  156.     if (a == 0) {
  157.         perev(b1, b2, num1, num2);
  158.         printf("%s", num2);
  159.     }
  160.     return 0;
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement