Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/41: Рейтинг темы: голосов - 41, средняя оценка - 4.73
3 / 3 / 1
Регистрация: 29.10.2013
Сообщений: 33

Перевод десятичных дробей из одной системы счисления в другую

14.09.2014, 00:00. Показов 8570. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как переводить дробь из одной системы счисления в другую я знаю. Но есть такая проблема:
дробь 0.1 в десятичной системе имеет следующий вид в восьмеричной:
0.063146314631463146314................. .................................
тоесть она будет периодической дробью 0.0(6314) - где 6314 - период.
Подскажите как найти количество чисел в периоде периодической дроби при переводе из одной системы счисления в другую.
Или как найти период в получившейся дроби.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.09.2014, 00:00
Ответы с готовыми решениями:

Перевод из одной системы счисления в другую
помогите перевести из 8 ричной системы счисления в 16 ричную ----> Перевод из системы по основанию 8 в систему по основанию 16 ...

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

Перевод из одной системы счисления в другую.
Мне задали сделать калькулятор для программиста на языке С. В нем требуется выполнение операций только целые числа, 4 арифметических...

5
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
14.09.2014, 06:26
Нет, я все понимаю, школу давно кончали, но хоть ключевые слова для гугления надо помнить. Периодическая дробь представляется суммой членов бесконечной геометрической прогрессии вида https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{x}{{y}^{n}}. Сумма сходится к https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{x/y}{1-\frac{1}{y}}. Где x - период, а y - основание (в нашем случае 8) в некоторой целой степени. Ну а дальше решаем уравнение с двумя неизвестными "0.1=https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{x/y}{1-\frac{1}{y}}". Хоть тупым перебором всех возможных вариантов y.
0
543 / 486 / 104
Регистрация: 05.05.2014
Сообщений: 1,110
14.09.2014, 10:23
Лучший ответ Сообщение было отмечено sergei11 как решение

Решение

sergei11, вот, поскреб по сусекам, может быть поможет.
Там перевод обыкновенной дроби в десятичную, но легко модифицируется для других систем счисления
Алгоритм простой - в 5-м классе, кажется, проходили.
Пусть N - числитель, M - знаменатель ( N < M - дробь правильная)
a: N *= 10;
c = N / M; // это очередная цифра
N = N % M;
// Точка истины
goto a;
Если N стало = 0, получилась точная десятичная дробь,
вычисления заканчиваем
Как поймать возникновение периода?
Очевидно, период возникает, как только N повторит одно из своих
предыдущих значений.
Этих значений < M
Поэтому заводим массив int x[M], x[i] - номер шага, на котором N==i
По началу все x[i] = 0.
Останавливаемся тогда, когда x[N] != 0
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
#include <stdio.h>
#include <alloc.h>
Drob(int NN, int M)
{
  long N = NN;   // исходное значение нам еще понадобится
 // Пришлось вместо int использовать long N, т.к. при умножении на 10
 // даже такого небольшего числа, как 3720, N > MAX_INT
  int c, i, step, period, dop, flag;
  int *x;
 
  printf(" %d / %d =\n", NN, M);
  x = (int *)malloc(M * sizeof(int));
  for(i=0; i<M; i++) x[i] = 0;
  step = 1;
  while(1) {
    N *= 10;
    c = N / M;
    N = N % M;
       // Точка истины
    if (N==0) {
      printf("точная десятитичная дробь\n");
      period = 0;
      break;
    }
    if (x[N]!=0) {
      period = step - x[N];
      dop = x[N] - 1;  // Сколько цифр надо печатать до периода
      printf("Периодическая дробь, длина периода = %d dop=%d\n", period, dop);
      break;
    }
    x[N] = step;
    step++;
  }
      // Теперь число печатаем
  printf("0.");
  N = NN;
  i = 0;
  flag = 0;
  while(1) {
    if (flag==0 && period && i >= dop) {
      printf("(");
      flag = 1;  // Флаг - печатаем период
      i = 0;
    }
    N *= 10; // Это для десятичной с/с Для p-с/с надо умножать на p
    c = N / M;
    printf("%d", c);
    N = N % M;
    if (N==0) break;
    if (period==0) continue; // Для точной дроби все что ниже - не нужно
    i++;
    if (flag && i >= period) {
      printf(")\n");
      break;
    }
  }
}
/*****************/
main(int argc, char *argv[])
{
   if (argc<3) exit(1);
   Drob(atoi(argv[1]), atoi(argv[2]));
}
/**************/
Запуск: drob.exe числитель знаменатель
В твоем случае надо будет еще добавить основание с/с

Добавлено через 5 минут
Прошу прощения. В строке 16 тоже надо умножать на p, а не на 10
2
3 / 3 / 1
Регистрация: 29.10.2013
Сообщений: 33
14.09.2014, 19:34  [ТС]
Renji, То что вы написали я ,к сожалению, не понял. Если y изменяется, то это функция. А если подставить вместо y систему счисления то результат не подходит.
8-BITOV, спасибо. ваш вариант мне помог.
0
0 / 0 / 0
Регистрация: 04.10.2014
Сообщений: 3
13.10.2014, 17:30
Здравствуйте, не подскажите как в данной программе сделать так чтобы она могла переводить не только целые числа, например 972,25?
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var n: integer;
 
procedure InternalToBin(n: longint);
begin
if n < 2 then write(n)
else begin
  InternalToBin(n div 2);
  write(n mod 2);
end;
end;
 
begin
readln(n);
InternalToBin(n);
readln;
end.
0
3 / 3 / 1
Регистрация: 29.10.2013
Сообщений: 33
13.10.2014, 20:03  [ТС]
Kina_63, Нужно разделить число на целую и дробную часть. Например
int A = (int) B; - A - целая часть
double S = B - A; - S - дробная часть
отдельно перевести целую и дробную часть, потом сложить.
[URL="http://www.zaurtl.ru/UkVT/UKVT6.html"]Перевод чисел из одной системы счисления в другую[URL]

Я писал программу, которой подаются 3 числа: a,b,k. Вывод программы a/b в системе счисления k.
Только я пишу на java.
Java
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
107
108
109
110
public class Div {
     public static void main(String[] args)
     {
         /*предполагается, колическто аргуметов кратно 3-м. - a b base*/
         if( args.length % 3 > 0 ) throw new IllegalArgumentException("ошибка в агрументах программы.");
 
         /*scale - максимальное число знаков после запятой  в результате*/
         int scale = 100;
         for ( int i = 0; i < args.length; i +=3)
         {
             int k = Integer.parseInt(args[i+2]);
             String value = Division(args[i],args[i + 1],k,scale);
             System.out.println(value);
         }
     }
    public static String Division (String A, String B, int base, int scale)
    {
        if (A.contains(".") || B.contains(".")) throw new IllegalArgumentException("Дробные значения a,b не поддерживаются");
 
        /*проверка наличия отрицательных чисел*/
        int sign = 1;
        if (A.contains("-")) {sign *= (-1); A = A.replace("-","");}
        if (B.contains("-")) {sign *= (-1); B = B.replace("-", "");}
 
        /*конвертация в десятичную систему счисления*/
        int a = Utils.convertToDecimal(A, base);
        int b = Utils.convertToDecimal(B, base);
        if (a < 0 || b < 0) throw new IllegalArgumentException ("Ошибка в аргументах программы, поддерживаются системы счисления 2-10, 16");
 
        /*получения целой части результата деления, если остаток от деления = 0, то дробная часть отсутствует*/
        int mod, Int;
        mod = a % b;
        String value = Utils.convertToBase(a/b, base);
        if( sign < 0) value = "-" + value;
        if(mod == 0) return value;
 
        /*вычисление дробной части*/
        value += ".";
        int step = 0;
        int periodLength = 0;
        while ( mod > 0 && step <=((b+1)*2))
        {
            a = mod * base;
            Int =  a/b;
            mod = a % b;
            value += Utils.valueToDigit(Int);
            step++;
 
            /*если step > b, то дробь периодическая*/
            if ( step == b + 1)
            {
                periodLength = getPeriodLength(mod, b, base);
            }
        }
        if (periodLength <= 0 || periodLength > scale){
            if((value.length()-value.indexOf(".")+1) < scale) return value;
            return value.substring(0,value.indexOf(".")+scale+1);
        }
        value = locatePeriod(value,periodLength);
        return value;
    }
 
    /*длина периода*/
    public static int getPeriodLength(int mod, int b, int k)
    {
        int tmod = mod;
        int a = tmod * k;
        tmod = a % b;
        int pLength = 1;
        while (tmod != mod)
        {
            a = tmod * k;
            tmod = a % b;
            pLength++;
        }
        return pLength;
    }
 
    /*выделение периода*/
    public static String locatePeriod(String number, int pLength )
    {
        if (pLength <= 0) return number;
        int left = number.indexOf(".")+1;
        int right = left + pLength;
        int left2, right2;
        boolean flag = false;
        String seq1, seq2;
        while (right < number.length())
        {
            seq1 = number.substring(left,right);
            left2 = right;
            right2 = left2 + pLength;
            while (right2 < number.length())
            {
                seq2 = number.substring(left2,right2);
                flag = seq1.equals(seq2);
                if (!flag) break;
                left2 = right2;
                right2 = left2 + pLength;
            }
            if(flag) break;
            left++;
            right++;
        }
        if (!flag) return number;
        String period = number.substring(left,right);
        number = number.substring(0,left)+ "("+period+")";
        return number;
    }
}
Вспомогательный класс:
Java
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
public class Utils {
 
    /*значение для полученой цифры*/
    public static int digitToValue(char c)
    {
        if (c >= '0' && c <='9') return c - '0';
        else if ( c >= 'A' && c <= 'F') return 10 + c -'A';
        else if (c >= 'a' && c <= 'f') return 10 + c - 'a';
        return -1;
    }
 
    /*цифра для полученого значения*/
    public static char valueToDigit(int c)
    {
        if (c >= 0 && c <=9) return (char)((int)'0' + c);
        if (c >= 10 && c <= 15) return (char)(c - 10 + (int)'A');
        return '?';
    }
 
    /*конвертация целого положительного числа в системе счисления base в десятичную систему счисления*/
    public static int convertToDecimal(String number, int base)
    {
        if (base < 2 || (base > 10 && base != 16)) return -1;
        int value = 0;
        for (int i = number.length() - 1; i >= 0; i--)
        {
            int digit = digitToValue(number.charAt(i));
            if(digit < 0 || digit >=base)
            {
                return  -1;
            }
            int exp = number.length() -1-i;
            value += digit * Math.pow(base,exp);
        }
        return value;
    }
 
    /*конвертация целого положительного числа в десятичной системе в число в системе счисления base*/
    public static String convertToBase(int i, int base)
    {
        if (base < 2 || (base > 10 && base != 16)) return "????";
        String value = "";
        int  mod;
        while (i >= base)
        {
            mod = i%base;
            i = i/base;
            value = valueToDigit(mod) + value;
        }
        value = valueToDigit(i) + value;
        return value;
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.10.2014, 20:03
Помогаю со студенческими работами здесь

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

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

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

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

Перевод с одной системы счисления в другую
Приветствую вас, товарищи программисты. Помогите пожалуйста. Не могу решить, маленькую проблемку. Как сделать так, что-бы при вводе...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru