Advertisement
BanyRule

Untitled

Sep 28th, 2016
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.75 KB | None | 0 0
  1. // (づ°ω°)づミe★゜・。。・゜゜・。。・゜☆゜・。。・゜゜・。。・゜
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #include <stdio.h>
  4. #include <math.h>
  5. #include <string.h>
  6.  
  7. int char_to_dig(char c) {
  8.     // '1' = 1, '2' = 2 ... 'A' = 10, 'B' = 11...
  9.     if (c >= 'a' && c <= 'z')
  10.         c += 'A' - 'a';
  11.  
  12.     return (c >= 'A' && c <= 'Z') ? (10 + c - 'A') : (c - '0');
  13. }
  14.  
  15. char dig_to_char(int n) {
  16.     // 1 = '1', 2 = '2' ... 'A' = 10, 'B' = 11...
  17.     return (n >= 0 && n <= 9) ? ('0' + n) : ('A' - 10 + n);
  18. }
  19.  
  20. /*
  21. * ПЕРЕВОД в 10 СС из A СС
  22. * num_sys - исходная СС, number - строка содержащая запись числа в a CC
  23. */
  24. long double num_sys_to_dec(int num_sys, char *number) {
  25.  
  26.     long double sum = 0;
  27.     long long int integer_part = 0;
  28.     int i = 0;
  29.     char c = 0;
  30.  
  31.     //сначала читаю часть числа до запятой
  32.     for (i = 0; (c = *number) != '.'; ++i) {
  33.         integer_part = (integer_part * num_sys) + char_to_dig(c);
  34.         ++number;
  35.     }
  36.  
  37.     //пропускаем точку
  38.     ++number;
  39.  
  40.     //считаю сумму разрядов до запятой
  41.     for (i = 0; integer_part > 0; ++i) {
  42.         sum += (integer_part % num_sys) * pow(num_sys, i);
  43.         integer_part /= num_sys;
  44.     }
  45.  
  46.     //читаю разряды после запятой и сразу считаю их сумму
  47.     for (i = -1; (c = *number) != '\0'; --i) {
  48.         sum += char_to_dig(c) * pow(num_sys, i);
  49.         ++number;
  50.     }
  51.     return sum;
  52. }
  53.  
  54. double num_sys_to_integer_dec(int num_sys, char *number) {
  55.     long double sum = 0;
  56.     long long int integer_part = 0;
  57.     int i = 0;
  58.     char c = 0;
  59.     //сначала читаю часть числа до запятой
  60.     for (i = 0; (c = *number) != '\0'; ++i) {
  61.         integer_part = (integer_part * num_sys) + char_to_dig(c);
  62.         ++number;
  63.     }
  64.     //считаю сумму разрядов до запятой
  65.     for (i = 0; integer_part > 0; ++i) {
  66.         sum += (integer_part % num_sys) * pow(num_sys, i);
  67.         integer_part /= num_sys;
  68.     }
  69.     return sum;
  70. }
  71.  
  72. /*
  73. * ПЕРЕВОД в A СС из 10 СС
  74. * number - число в 10 СС, num_sys - СС в которую надо перевести
  75. */
  76. void dec_to_num_sys(long double number, int num_sys) {
  77.     int i = 0, j = 0;
  78.     char c = 0;
  79.     char integer_result_str[80], fractional_result_str[80];
  80.     long long int integer_part = (long long int)number;
  81.     long double fractional_part = number - (long long int)number;
  82.  
  83.     //подсчет целой части
  84.     do {
  85.         integer_result_str[i++] = dig_to_char(integer_part % num_sys);
  86.         integer_part /= num_sys;
  87.     } while (integer_part);
  88.     integer_result_str[i] = '\0';
  89.     //разворот строки
  90.     int len = i;
  91.     for (i = 0; i < len / 2; ++i) {
  92.         int temp = integer_result_str[i];
  93.         integer_result_str[i] = integer_result_str[len - i - 1];
  94.         integer_result_str[len - i - 1] = temp;
  95.     }
  96.  
  97.     // подсчет дробной части
  98.     i = 0;
  99.     while (fractional_part > 0 && i < 12) {
  100.         fractional_part *= num_sys;
  101.         integer_part = (long long int)fractional_part;
  102.         fractional_part -= (long long int)fractional_part;
  103.         fractional_result_str[i++] = dig_to_char(integer_part);
  104.     }
  105.     //while (i < 1){
  106.     //  fractional_result_str[i++] = '0';
  107.     //}
  108.  
  109.     fractional_result_str[i] = '\0';
  110.  
  111.     if (i == 0)
  112.         printf("%s.0\n", integer_result_str);
  113.     else
  114.         printf("%s.%s\n", integer_result_str, fractional_result_str);
  115. }
  116.  
  117. int main() {
  118.  
  119.     int num_sys1 = 0;
  120.     int num_sys2 = 0;
  121.     char number[80];
  122.     long double dec = 0;
  123.     int fractional_part = 0;
  124.  
  125.     //freopen("in.txt", "r", stdin);
  126.     scanf("%d %d\n", &num_sys1, &num_sys2);
  127.     gets(number);
  128.  
  129.     /*ПРОВЕРКА ВВОДА*/
  130.     // Если b1 и b2 в первой строке не от 2 до 16, то "bad input".
  131.     if ((num_sys1 < 2 || num_sys1 > 16) || (num_sys2 < 2 || num_sys2 > 16)) {
  132.         printf("bad input\n");
  133.         return 0;
  134.     }
  135.  
  136.     char *p = number;
  137.     //точка - плохое начало
  138.     if (*p == '.') {
  139.         printf("bad input\n");
  140.         return 0;
  141.     }
  142.     while (*p) {
  143.         // Если в второй строке не b1-ричная запись, то "bad input".
  144.         if ((char_to_dig(*p) > num_sys1 - 1) && (*p != '.')) {
  145.             printf("bad input\n");
  146.             return 0;
  147.         }
  148.         //ВОЗМОЖНО разделенных точкой на целую и дробную часть
  149.         if (*p == '.') {
  150.             fractional_part += 1;
  151.         }
  152.         ++p;
  153.     }
  154.     //почему-то в конце её тоже не должно быть
  155.     --p;
  156.     if (*p == '.') {
  157.         printf("bad input\n");
  158.         return 0;
  159.     }
  160.     //больше одной запятой нам не нужно
  161.     if (fractional_part > 1) {
  162.         printf("bad input\n");
  163.         return 0;
  164.     }
  165.  
  166.     /*ПЕРЕВОД*/
  167.     if (fractional_part)
  168.         dec = num_sys_to_dec(num_sys1, number);
  169.     else
  170.         dec = num_sys_to_integer_dec(num_sys1, number);
  171.  
  172.     dec_to_num_sys(dec, num_sys2);
  173.  
  174.     return 0;
  175. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement