0 / 0 / 0
Регистрация: 06.11.2019
Сообщений: 16
1

Перевод систем исчисления

04.12.2019, 20:33. Показов 1483. Ответов 6

Здравствуйте, прошу помочь с задачей на скриншоте. Получается только половина правильных ответов. Подозреваю , что это из-за того, что я записываю получившееся число в десятичной системе в int, хотя изначально число может быть длиной в 10к цифр и даже переведенное в 10 систему может не поместиться, но сам пока не понимаю как это исправить.
Заранее спасибо
P/S/ перечитал много похожих тем, прежде чем идти сюда, но ответа не нашел, только алгоритм - перевести в 10 систему - из нее в нужную систему АB


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <stdio.h>
#include <math.h>
 
 
int in_10_system(int *arr, int A, int L)
{
    int i = 0, L2 = L, ten_sys_number=0;
    L--;
    for (i; i != L2; i++)
    {
        arr[i] = arr[i] * pow(A, L--);
        ten_sys_number += arr[i];
    }
    return ten_sys_number;
}
 
 
int in_new_system(int ten_sys_number,  int B, int *arr_ostatkov)
{
    int i = 0, u = 0, ten_sys_number2 = ten_sys_number;
 
    for (i = 0; i != ten_sys_number / 2; i++)
    {
        
        if (ten_sys_number2 % B == 0)
        {
            arr_ostatkov[u++] = ten_sys_number - ten_sys_number2;
            ten_sys_number = ten_sys_number2 / B;
            ten_sys_number2 = ten_sys_number2 / B;
            i = 0;
        }
 
        else ten_sys_number2--;
 
 
 
        if (ten_sys_number <= B) { arr_ostatkov[u++] = ten_sys_number;  break; }
 
    } 
    u--;
    return u;
}
 
 
void print_number(int *arr_ostatkov, int u)
{
    for (u; u > -1; u--)
    {
        if (arr_ostatkov[u] >= 0 && arr_ostatkov[u] <= 9) { printf("%d", arr_ostatkov[u]); }
        else 
        {
             if (arr_ostatkov[u] == 10)putchar(65);
        else if (arr_ostatkov[u] == 11)putchar(66);
        else if (arr_ostatkov[u] == 12)putchar(67);
        else if (arr_ostatkov[u] == 13)putchar(68);
        else if (arr_ostatkov[u] == 14)putchar(69);
        else if (arr_ostatkov[u] == 15)putchar(70);
        else if (arr_ostatkov[u] == 16)putchar(71);
        else if (arr_ostatkov[u] == 17)putchar(72);
        else if (arr_ostatkov[u] == 18)putchar(73);
        else if (arr_ostatkov[u] == 19)putchar(74);
        else if (arr_ostatkov[u] == 20)putchar(75);
        else if (arr_ostatkov[u] == 21)putchar(76);
        else if (arr_ostatkov[u] == 22)putchar(77);
        else if (arr_ostatkov[u] == 23)putchar(78);
        else if (arr_ostatkov[u] == 24)putchar(79);
        else if (arr_ostatkov[u] == 25)putchar(80);
        else if (arr_ostatkov[u] == 26)putchar(81);
        else if (arr_ostatkov[u] == 27)putchar(82);
        else if (arr_ostatkov[u] == 28)putchar(83);
        else if (arr_ostatkov[u] == 29)putchar(84);
        else if (arr_ostatkov[u] == 30)putchar(85);
        else if (arr_ostatkov[u] == 31)putchar(86);
        else if (arr_ostatkov[u] == 32)putchar(87);
        else if (arr_ostatkov[u] == 33)putchar(88);
        else if (arr_ostatkov[u] == 34)putchar(89);
        else if (arr_ostatkov[u] == 35)putchar(90);
        }
    }
}
 
int main()
{
    const int n = 10000;
    int A, B, L, arr[n], arr_ostatkov[n], i = 0, u, ten_sys_number;
    char C;
 
    scanf_s("%d %d %d", &A, &B, &L);
 
    C = getchar();
    B = pow(A, B);
 
    for (i; i != L; i++)
    {
        C = getchar();
        arr[i] = C - '0';
    }
 
    ten_sys_number = in_10_system(arr, A, L);
 
    u = in_new_system(ten_sys_number, B, arr_ostatkov);
 
    print_number(arr_ostatkov, u);
 
    return 0;
}
Миниатюры
Перевод систем исчисления  
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.12.2019, 20:33
Ответы с готовыми решениями:

Перевод числа из Восьмеричной системы исчисления в Двоичную
Доброго времени суток. В этому году решил связать свою жизнь с прогой, поступив в универ, но пока...

Перевод систем счисления
Дано число в двоичной системе счисления. Нужно перевести его в систему счисления по основанию 4...

Перевод из систем счислений
Здравствуйте,легкий у меня вопрос,собственно имеется задание &quot;число 28.43 перевести в 2с.с. с...

Рекурсия. Перевод систем счисления
Написать рекурсивную функцию перевода нату¬рального числа из десятичной системы счисления в...

6
Мозгоправ
1737 / 1031 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
04.12.2019, 23:28 2
Лучший ответ Сообщение было отмечено Sgadmer как решение

Решение

Sgadmer, не уверен, но попробуйте это:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
 
// 2 4 32 00111011100101110110011011001111
 
const char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 
int ipow(int base, int ex) {
    int res = 1;
    while (ex--)
        res *= base;
    return res;
}
 
int main(void)
{
    int a, b, l;
    int base;
    int digit;
    char ch;
    scanf("%d %d %d", &a, &b, &l);
    getchar();
    base = ipow(a, b);
    for (int i = 0; i < l / b; ++i) {
        digit = 0;
        for (int j = 0; j < b; ++j) {
            ch = getchar();
            if (isdigit(ch))
                ch -= '0';
            else
                ch -= 'A';
            digit = digit * a + ch;
        }
        putchar(digits[digit]);
    }
    puts("");
 
    return 0;
}
1
0 / 0 / 0
Регистрация: 06.11.2019
Сообщений: 16
07.12.2019, 20:14  [ТС] 3
L0M, большое спасибо, все работает! Но ,не могли бы вкратце объяснить, что делает ваша программа? Я не совсем ее понимаю. И что означает while (ex--) ?
0
Мозгоправ
1737 / 1031 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
07.12.2019, 21:58 4
Sgadmer, в общем, всё довольно просто.

Функция int ipow(int base, int ex) - возведение целого числа base в степень ex.
Цитата Сообщение от Sgadmer Посмотреть сообщение
И что означает while (ex--) ?
продолжать цикл, пока ex не станет равным 0.

В main():

Сначала ввод первых трёх чисел. Строка 23 - добираем из входного потока '\n', что бы следующий символ был первым из второй строки.

base - вычисляем новое основание системы счисления (AB).

Внутренний цикл вычисляет цифру в новой системе счисления. Для этого извлекает из входного потока b цифр в старой системе счисления, переводит символы в числа (строки 29-32) и накапливает в digit номер цифры в новой системе счисления (digit * основание_старой_системы - это сдвиг на один разряд влево в системе A + младший разряд в системе A). По окончании внутреннего цикла digit содержит номер цифры в системе счисления AB. Далее просто из массива цифр digits выбираем нужную и выводим её на экран.

Внешний цикл запускает внутренний цикл столько раз, сколько цифр в системе счисления AB содержится в строке цифр в системе счисления A.

Т.е., используя тестовые данные:
- основание старой системы счисления - 2 (A - задано).
- количество цифр старой системы счисления в новой системе счисления - 4 (B - задано).
- количество цифр числа в старой системе счисления - 32 (L - задано).
- основание новой системы счисления - 16 (base - посчитали).
- внешний цикл выполнится 8 раз (L / B = 32 / 4 = 8) по количеству цифр в числе в новой системе счисления.
- внутренний цикл берёт из строки очередные 4 (B) символа и вычисляет цифру в новой системе счисления.
0
0 / 0 / 0
Регистрация: 06.11.2019
Сообщений: 16
07.12.2019, 23:36  [ТС] 5
L0M, теперь понятно, что к чему. Только вашей программе функция ipow и не нужна, ибо по факту не используется. Благодарю, за помощь)
0
Мозгоправ
1737 / 1031 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
08.12.2019, 01:02 6
Цитата Сообщение от Sgadmer Посмотреть сообщение
ipow и не нужна, ибо по факту не используется
Используется. Строка 24.
0
С чаем беда...
Эксперт CЭксперт С++
10000 / 5350 / 1463
Регистрация: 18.10.2014
Сообщений: 12,888
08.12.2019, 10:26 7
Цитата Сообщение от Sgadmer Посмотреть сообщение
из нее в нужную систему АB
Это задача - на понимание того факта, что новая запись числа получается простой "нарезкой" исходного числа на кусочки длины B с последующим переводом каждого кусочка в отдельную цифру. В этом вся суть этой задачи. Для того, чтобы упростить вам жизнь, условие даже гарантирует, что L кратно B. Это фактически подсказка о том, как правильно решать эту задачу.

Такая задача элементарно решается средствами стандартной библиотеки. Не нужно даже вычислять AB.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
 
int main()
{
  unsigned a, b, l;
  scanf("%u%u%u", &a, &b, &l);
  assert(l % b == 0);
  assert(b <= 36);
  
  char format[5];
  sprintf(format, "%%%us", b);
  
  for (; l > 0; l -= b)
  {
    char segment[37];
    scanf(format, segment);
    unsigned digit = strtoul(segment, NULL, a);
    assert(digit <= 36);
    printf("%c", digit < 10 ? '0' + digit : 'A' + digit - 10);
  }
 
  printf("\n");
}
Единственно что strtoul не поддерживает "одноричную" систему счисления. Но не ясно, нужно ли ее поддерживать в задаче вообще. Но в любом случае это делается тривиально, ибо тогда вообще ничего не нужно переводить.

Добавлено через 4 минуты
Цитата Сообщение от L0M Посмотреть сообщение
Используется. Строка 24.
И? И где же дальше в коде используется полученное в строке 24 значение base?

Sgadmer заметил совершенно правильно. Функция ipow в вашей программе не нужна вообще.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.12.2019, 10:26
Помогаю со студенческими работами здесь

Перевод систем исчисления
Последовательность действий для выполнения задания. 1_1. Вводится в буфер памяти знаковое...

Перевод из систем исчисления
Помогите написать скрипт для перевода чисел из десятеричной системы исчисления в двоичную toString...

Калькулятор для систем исчисления с 2-ой до 36-ой
Привет всем. Очень нужна помощь. Нужно написать программу &quot;Калькулятор для систем исчисления с 2-ой...

Перевод числа из 16-й в 10-ю систему исчисления
Доброго времени суток.Такая вот задачка: Напишите процедуру pereved (перевод), которая входной...

Перевод в n-ричную систему исчисления
помогите плиз... надо програмка в C# для переводя значений из одной системы исчисления в другую.......

Перевод в двоичную систему исчисления
Дана строка, изображающая десятичную запись целого положительного числа. Вывести строку,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru