LINUX.ORG.RU

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

 


0

2

как реализовать это на сях?

пробовал вот так, теряются нули (например: Converted decimal value 3 to ternary value 1 [должно быть 10], Converted decimal value 6 to ternary value 2 [должно быть 20], Converted decimal value 9 to ternary value 1 [должно быть 100], и.т.д)

int ToTernary(int source) {
	int mod, result = 0;

	while(source != 0) {
		mod = source % 3;
		source = source / 3;
		result = result*10+mod;
	}
	printf("Converted to ternary value %d\n", result);
//	return Reverse(result);	
}

★★★★★

добавляешь в конец, а нужно было в начало

anonymous
()
int ToTernary(int source) {
	int mod, result = 0, mul = 1;

	while(source != 0) {
		mod = source % 3;
		source = source / 3;
		result += mod * mul;
		mul *= 10;
	}
	printf("Converted to ternary value %d\n", result);
//	return Reverse(result);	
}
Micky53
()
Ответ на: комментарий от Erfinder

пробовал вот так, теряются нули (например: Converted decimal value 3 to ternary value 1 [должно быть 10], Converted decimal value 6 to ternary value 2 [должно быть 20], Converted decimal value 9 to ternary value 1 [должно быть 100], и...

snoopcat ★★★★★
() автор топика
#include <stdio.h>
#include <assert.h>
#include <string.h>

char *convert(char *buf, int num, int base);

#define TEST(EXPR)                              \
    printf(#EXPR ": %s\n", EXPR)

int main(void)
{
    char buf[1024];
    TEST(convert(buf, 42, 2));
    TEST(convert(buf, 100500, 36));
    TEST(convert(buf, 42, 3));
    TEST(convert(buf, 100500, 16));

    return 0;
}

char *reverse(char *buf)
{
    int length = strlen(buf);

    for(int i = 0, j = length - 1; i < j; ++i, --j) {
        char temp = buf[i];
        buf[i] = buf[j];
        buf[j] = temp;
    }

    return buf;
}

char *convert(char *buf, int num, int base)
{
    static const char *digits =
        "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    char *pch = buf;

    assert(base >= 2 && base <= 36);

    while(num) {
        *pch++ = digits[num % base];
        num /= base;
    }

    *pch = '\0';

    return reverse(buf);
}
theNamelessOne ★★★★★
()

int это просто число, без привязки к системе счисления.

crowbar
()

О-ЛО-ЛО.

Интересно, как ты сделаешь этот reverse?

lispfuerimmer
()

Что это? Зачем это? Хотел что-то умное написать, но слов нет...

ЗЫ: задачу и смысл вообще не понял, но одного меня коробит от лишнего деления в теле цикла?

fornlr ★★★★★
()

Зы, а зачем это надо вообще? Ты понимаешь, что 2 равных числа в 2 разных системах счисления всё равно равны (система - это всего лишь способ репрезентации), а у тебя функция из 1 числа делает совсем другое.

lispfuerimmer
()

Первый анонимус правильно сказал. Должно быть


int ToTernary(int source) {
   int mod, result = 0, step = 1;
   while(source != 0) {
       mod = source % 3;
       source = source / 3;
       result += step*mod;
       step *= 10;
   }
   printf("Converted to ternary value %d\n", result);
}

monk ★★★★★
()
Ответ на: комментарий от monk

Первый анонимус правильно сказал

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

anonymous
()

если тебе просто вывести надо то зачем ты делаешь число вместо строки?

anonymous
()

и еще - «из десятичной» не соответствует действительности т.к. первоначально значение при исполнении программы скорее всего представлено в двоичной системе счисления :)

создается впечатление что ОП вообще не понимает о чем пишет.

anonymous
()
Ответ на: комментарий от anonymous

взятие остатка от деления и целочисленое деление. Умножение дешевле.

temp=source/3;
mod=source-temp*3;
source=temp;

Хотя хз как на практике, может и хуже выйдет.

fornlr ★★★★★
()
Ответ на: комментарий от fornlr

Хотя хз как на практике, может и хуже выйдет.

Особенно, если учесть, что на x86 (про другие архитектуры не скажу — не знаю), целая часть и остаток вычисляются одновременно.

anonymous
()
Ответ на: комментарий от fornlr

Зависит от уровня оптимизации.

anonymous
()
Ответ на: комментарий от fornlr

А лучше

div_t d = div(source, 3);
mod = d.rem;
source = d.quot;
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.