С Новым годом! Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.87/55: Рейтинг темы: голосов - 55, средняя оценка - 4.87
 Аватар для LightProger
42 / 42 / 16
Регистрация: 29.12.2016
Сообщений: 291

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

12.09.2017, 20:02. Показов 11879. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Никак не получается перевести, не врублюсь никак, в эту систему. Уже пол инета перерыл, не выходит.
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
#include <stdio.h>
 
 
 /* Перевести число из десятичной систему в троичную. */
 
int main ()
{
  int number = 0;
 
  printf("Введите целое десятичное число, больше нуля:\n");
  scanf("%i", &number);
 
      int i = 0, j = 0, rest = 0;
      while (number > 0)
        {
          rest = (number /= 3);
          j = rest % 3;
          printf("%i ", j);
          i++;
         }
  printf("\n");
 
 
 
  return 0;
}
Задача намного шире, но пока этот алгоритм сделать надо, может остальное само в голову придет.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.09.2017, 20:02
Ответы с готовыми решениями:

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

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

Перевод чисел из десятичной системы счисления в любую другую
Считать с клавиатуры целое неотрицательное число в десятичной системе счисления и основание новой системы счисления (целое число от 2 до...

21
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
12.09.2017, 20:43
Лучший ответ Сообщение было отмечено LightProger как решение

Решение

Надо поменять порядок - сначала берется остаток и только потом - деление:
C
1
2
3
4
5
6
7
int digit;
int number = 12345;
do{
  digit = number % 3;
  number = number / 3;
  printf("%i", digit);
}while(number > 0);
Правда вывод получается обратный - от младшего разряда к старшему. Если хотите прямой - заводите массив
C
1
2
3
4
5
6
7
8
9
10
int number = 12345;
char str[100]; //памяти не жалко!
int i=99;
str[99]=0; //конец строки
do{
  i--; //идем по массиву от конца к началу
  str[i] = (number % 3)+'0'; //чтобы вывелся символ, соответствующий цифре, а не хз что с ее кодом
  number /= 3;
}while(number > 0);
printf("%s\n",str+i);
Здесь уже вполне очевидно как изменить код для разложения по любому основанию.
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38165 / 21100 / 4307
Регистрация: 12.02.2012
Сообщений: 34,688
Записей в блоге: 14
12.09.2017, 21:21
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
#include <stdio.h>
#include <stdlib.h>
 
void d2t(int n)
{
     if (n < 3)
        printf("%d",n);
     else
     {
        d2t(n/3);
        printf("%d",n%3);
     }
}             
 
int main(int argc, char *argv[])
{
  int n;  
  
  printf("Enter decimal=");
  scanf("%d",&n);
 
  printf("Ternary=");
  d2t(n);
  printf("\n");
  
  system("PAUSE");  
  return 0;
}
1
 Аватар для LightProger
42 / 42 / 16
Регистрация: 29.12.2016
Сообщений: 291
12.09.2017, 21:36  [ТС]
COKPOWEHEU, Спасибо, за подсказку, накатал.
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
#include <stdio.h>
 
/* Ввести число
 * Если введено не число, выйти из программы
 * Превести число из десятичной системы в троичную
 * Записать все в массив и вывести на экран в перевернутом виде
 */
 
int main ()
{
  int number;
  int i, k;
 
  i = number = 0;
  printf("Введите целое десятичное число, больше нуля:\n");
  scanf("%i", &number);
 
 
    if(number < 1) printf ("Ошибка ввода!");
    else
      {
        int array[10];
 
        while(number > 0)
          {
            array[i] = (number % 3);
            number /= 3;
            i++;
          }
 
        for(k = i - 1; k >= 0; k--) { printf("%i ", array[k]);}
      }
 
  printf("\n");
  return 0;
}
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
12.09.2017, 21:46
Вместо while{...} лучше все-таки do{...}while - эта конструкция гарантированно отработает хотя бы один раз, то есть число меньшее 3 (в том числе 0).
Заполнение массива тоже лучше делать с конца - это проще и не придется потом переворачивать.
Пара замечаний по форматированию:
в 19 строке условие if сдвинуто вправо, хотя находится в том же блоке
в 21-22 строках фигурные скобки образуют ложный блок - сдвигают код лишний раз вправо. Если уж выносите открывающую скобку на новую строку, располагайте ее по внешнему блоку, а не по внутреннему
Catstail, Месье знает толк... в рекурсии
2
 Аватар для LightProger
42 / 42 / 16
Регистрация: 29.12.2016
Сообщений: 291
12.09.2017, 21:48  [ТС]
COKPOWEHEU, Спасибо, за рекомендации, учту!
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
12.09.2017, 22:26
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Пара замечаний по форматированию:
в 19 строке условие if сдвинуто вправо, хотя находится в том же блоке
в 21-22 строках фигурные скобки образуют ложный блок - сдвигают код лишний раз вправо. Если уж выносите открывающую скобку на новую строку, располагайте ее по внешнему блоку, а не по внутреннему
Вы даже не представляете себе, сколько разных стилей форматирования существует (в том числе и по этой паре скобок и их отступам), критикуемый здесь -- не самый плохой из них...
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
12.09.2017, 22:42
Отчего ж не представляю!
Когда-то наткнулся на программу автоматического форматирования (сейчас не вспомню названия), так пока перебирал ключи насмотрелся на самые разные стили.
А у ТСа и правда неплохой стиль. Обычно на форум вываливают в куда худшем состоянии.
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
12.09.2017, 22:50
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
#include <stdio.h>
 
char * b3(unsigned n, char * b) {
    if ( n > 2 )
        b = b3(n / 3, b);
    *b = n % 3 + '0';
    *++b = '\0';
 
    return b; 
}
 
char * base3(unsigned num, char * buf) {
    b3(num, buf);
 
    return buf;
}
 
int main(void) {
    unsigned n;
    char buf[64];
 
    while ( printf("Number: ") && scanf(" %d", &n) == 1 )
        printf("Result: %s\n", base3(n, buf));
 
    return 0;
}
1
 Аватар для LightProger
42 / 42 / 16
Регистрация: 29.12.2016
Сообщений: 291
12.09.2017, 23:12  [ТС]
Чуток переделал еще.
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
#include <stdio.h>
 
/* Ввести число
 * Если введено не число, выйти из программы
 * Перевести число из десятичной системы в троичную
 * Записать все в массив и вывести на экран в перевернутом виде
 */
 
void conversionNumbers(int number);
 
int main ()
{
  int number = 0;
 
  printf("Введите целое десятичное число, больше нуля:\n");
  scanf("%i", &number);
 
  if(number < 1) { printf("Ошибка ввода!"); }
  else { conversionNumbers(number); }
  printf("\n");
  return 0;
}
 
 
void conversionNumbers(int number)
{
  int i, k;
  int array[20];
 
  i = 0;
  while(number > 0)
  {
    array[i] = number % 3;
    number /= 3;
    i++;
  }
 
  for(k = i - 1; k >= 0; k--) { printf("%i", array[k]); }
 
  return;
}
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
13.09.2017, 10:27
Но, возможно, лучше так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
char *to_base(unsigned long long n, unsigned base, char *dst)
{
  static char d[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  if (base >= sizeof(d)) { *dst='\0'; return dst };
  char *p = dst, *q = dst, t;
  do { *p++ = d[n % base]; n /= base; } while (n);
  *p-- = '\0';
  while (p > q) { t = *q; *q++ = *p; *p-- = t; }
  return dst;
}
int main() {
  char s[22];
  printf("%s\n", to_base(256,3,s));
  return 0;
}
0
 Аватар для LightProger
42 / 42 / 16
Регистрация: 29.12.2016
Сообщений: 291
13.09.2017, 14:14  [ТС]
Цитата Сообщение от bormant Посмотреть сообщение
Но, возможно, лучше так:
Да, тут наставник сказал переделать, сегодня вечером буду мудрить. Сказал массив вобще убрать, когда-нибудь его размера может не хватить, ну и добавить проверку условия, буква введена или цифра,
0
 Аватар для LightProger
42 / 42 / 16
Регистрация: 29.12.2016
Сообщений: 291
14.09.2017, 17:46  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Правда вывод получается обратный - от младшего разряда к старшему. Если хотите прямой - заводите массив
А можно сделать прямой вывод, но без использования массива, дали такое задание переделать эту программу,, что-то я и так кручу и эдак - не силен в математике. Единственное понял, что надо сначала десятичное число, разбить на разряды, а потом, что делать, не понятно.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
14.09.2017, 18:03
Цитата Сообщение от LightProger Посмотреть сообщение
прямой вывод, но без использования массива
рекурсия в помощь.

Добавлено через 1 минуту
Или поразрядная маска.
1
 Аватар для LightProger
42 / 42 / 16
Регистрация: 29.12.2016
Сообщений: 291
14.09.2017, 18:09  [ТС]
Цитата Сообщение от bormant Посмотреть сообщение
рекурсия в помощь.
Добавлено через 1 минуту
Или поразрядная маска.
Если бы еще знать, что это такое....

Добавлено через 4 минуты
bormant, Хорошо, что сказали про рекурсию, скопировал кусок кода, который написал Catstail, переделал под свои переменные, работает. Урааа! bormant, Catstail, - спасибо!
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
14.09.2017, 19:05
Что-то мне подсказывает, что рекурсия затратит еще больше памяти чем массив...
1
 Аватар для LightProger
42 / 42 / 16
Регистрация: 29.12.2016
Сообщений: 291
14.09.2017, 20:03  [ТС]
COKPOWEHEU, Да, за рекурсию мне уже по рукам надавали. Опять переделывать надо, с помощью цикла, сижу мучаюсь. Последнюю цифру печатать не хочет.
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
14.09.2017, 20:52
По-моему, с массивом самый простой и быстрый вариант.
Но можно и поизвращаться:
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
#include <stdio.h>
#include <inttypes.h>
 
int main(){
  unsigned int base = 3;
  unsigned int pwr, res, num;
  scanf("%u", &num);
  res = 1;
  //ищем максимальное число, кратное base, влезающее в unsigned int
  do{
    pwr = res;
    res *= base;
  }while(res > pwr);
 
  //чтобы не рисовать ведущие нули, перебираем степени тройкисверху вниз
  do{
    res = num / pwr;
    num = num % pwr;
    pwr /= base;
  }while(res == 0);
  //выводим цифры
  printf("%i",res);
  while(pwr > 0){
    res = num / pwr;
    num = num % pwr;
    pwr /= base;
    printf("%i", res);
  }
  printf("\n");
}
1
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
15.09.2017, 09:36
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
//ищем максимальное число, кратное base, влезающее в unsigned int
//чтобы не рисовать ведущие нули, перебираем степени тройкисверху вниз
Не надо unsigned int, достаточно самого числа:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include  <stdio.h>
char *to_base(unsigned num, unsigned base, char *dst)
{
  static char d[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  if (!dst || base<2 || base>=sizeof(d)) return NULL;
  char *p=dst; unsigned pwr=1;
  while (pwr*base <= num) pwr *= base;
  do { *p++ = d[num/pwr%base]; pwr /= base; } while (pwr);
  *p='\0';
  return dst;
}
int main()
{
  char s[256];
  printf("%s\n", to_base(0xffff,16, s));
  return 0;
}
Добавлено через 3 минуты
Цитата Сообщение от LightProger Посмотреть сообщение
Если бы еще знать, что это такое...
Ну, рекурсию уже увидели, а маска -- то что выше названо pwr.

Добавлено через 14 минут
LightProger,
но лучше так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include  <stdio.h>
char *to_base(unsigned num, unsigned base, char *dst, size_t size)
{
  static char d[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  if (!dst || size<2 || base<2 || base>=sizeof(d)) return NULL;
  unsigned i=0, pwr=1; --size; //место под хвостовой 0
  while (pwr*base <= num) pwr *= base;
  do { dst[i++] = d[num/pwr%base]; pwr /= base; } while (pwr && i<size);
  if (pwr) dst[i-1] = '*'; //значение не влезло в буфер
  dst[i] = '\0';
  return dst;
}
int main()
{
  char s[256];
  printf("%s\n", to_base(0xffff,16, s, sizeof(s)));
  return 0;
}
Добавлено через 7 минут
или даже так (можем использовать цикл с предусловием):
C
1
2
3
4
5
6
7
8
9
10
11
char *to_base(unsigned num, unsigned base, char *dst, size_t size)
{
  static char d[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  if (!dst || size<2 || base<2 || base>=sizeof(d)) return NULL;
  unsigned i=0, pwr=1; --size;
  while (pwr*base <= num) pwr *= base;
  while (pwr && i<size) { dst[i++] = d[num/pwr%base]; pwr /= base; }
  if (pwr) dst[i-1] = '*';
  dst[i] = 0;
  return dst;
}
0
 Аватар для LightProger
42 / 42 / 16
Регистрация: 29.12.2016
Сообщений: 291
15.09.2017, 15:36  [ТС]
Вот решение наставника:
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
#include <stdio.h>
int convert (int a);
 
 
 
int main (void)
{
    int n = -1;
 
    /* получаем число */
    do
    {
        printf("Введите положительное целое число: ");
        scanf("%i", &n);
        getchar();
    }while(n < 0);
 
    /* выводим результат на экран */
    printf("Число %i в третичной системе счисления: %i\n", n, convert(n));
    return 0;
}
 
 
 
int convert (int a)
{
    int m, k = 0, num = 0;
 
    if (a > 0)
    {
        /* переводим число в систему счисления по основанию 3 */
        while (a > 0)
        {
            m = a%3;
            if (m == 0 && num == 0) k += 1;
            num = (num*10) + m;
            a = a/3;
        }
        /* переворачиваем число */
        a = num;
        num = 0;
        while (a > 0)
        {
            num = (num*10) + (a%10);
            a = a/10;
        }
        while (k > 0)
        {
            num *= 10;
            k -= 1;
        }
    }
    return num;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.09.2017, 15:36
Помогаю со студенческими работами здесь

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

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

Перевод из десятичной системы в троичную
Знаю, что здесь уже было много тем по данному вопросу. Ноу меня проблема. Sub zadanie() Dim m() k = 10 k3 = 3 x...

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

Перевод числа из десятичной системы в троичную и обратно
Класса, описывающий работу с числами в троичной системе счисления с реализованными следующими операциями: a) Перевод числа из десятичной...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru