Страница 1 из 2

Алгоритм разложения числа на цифры.

Добавлено: Вс дек 26, 2010 09:05:30
Pika4u
Необходим алгоритм разложения числа на цифры. Язык-с++. у меня есть кое-что на примете, но получается разложить число, в котором не больше 10 цифр.
long y1=100000000;
.
.
.
.
n1=binary%10;
n2=(binary%100-n1)/10;
n3=(binary%1000-n1)/100;
n4=(binary%10000-n1)/1000;
n5=(binary%100000-n1)/10000;
n6=(binary%1000000-n1)/100000;
n7=(binary%10000000-n1)/1000000;
n8=(binary%100000000-n1)/10000000;
n9=(binary%1000000000-n1)/y1;
r=(n9*256)+(n8*128)+(n7*64)+(n6*32)+(n5*16)+(n4*8)+(n3*4)+(n2*2)+(n1*1);
Это алгоритм перевода двоичного числа в десятичное.
Но! Если я пытаюсь сделать перевод числа с 10 цифрами, то компилятор ругается на превышение. То есть он ругается на число 1000000000. Как мне сделать это все по человечески?

Re: Алгоритм разложения числа на цифры.

Добавлено: Вс дек 26, 2010 09:55:30
Meteor
Поискать что-нибудь про рекурсивные функции и прикрутить ими решение.

Re: Алгоритм разложения числа на цифры.

Добавлено: Вс дек 26, 2010 10:11:41
Pika4u
Прочитал. Рекурсивные ф-ии-это ф-ии, вызывающие сами себя. Но, почти везде говорится, что лучше рекурсивными функциями не пользоваться, так как они сильно замедляют работу программы, чего мне очень не хочется. Может есть какой-нибудь другой вариант?

Re: Алгоритм разложения числа на цифры.

Добавлено: Вс дек 26, 2010 10:24:32
Meteor
Посчитать длину цифр - а далее разбить на приемлемые участки :idea:

Re: Алгоритм разложения числа на цифры.

Добавлено: Вс дек 26, 2010 10:32:19
Pika4u
Если честно-не очень понял. Мне надо число разбить на цифры(число двоичное). Например, 10010101100, надо представить как 1 0 0 1 0 1 0 1 1 0 0

Re: Алгоритм разложения числа на цифры.

Добавлено: Вс дек 26, 2010 10:46:32
Meteor
Допустим так. Пусть программа имеет ограниченность длиной 5 бит.
Исходное число принимает значения от 1 до 18 бит (условно).
На первом шаге определяем число бит.
Далее разделяем их на фрагменты длиной не более 5 бит. При этом заводим переменную в которой указываем сколько фрагментов получилось (для примера из 18 бит будет 4 фрагмента)
Ну а далее каждый фрагмент подвергаем декодированию, учитывая что результат надо скорректировать по степени 2 домножением на 32.
Вот както так

Re: Алгоритм разложения числа на цифры.

Добавлено: Вс дек 26, 2010 11:24:16
Pika4u
Спасибо вам огромное!Но я написал менее сложный алгоритм. Кому интересно, вот программа целиком:
#include <stdio.h>
#include <conio.h>
main()
{
int sys,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15,n16,n17,n18,n19,n20,n21,n22,n23,n24,binary,r;
long y1=100000000;
printf("Программа для перевода чисел между системами счисления.\n");
printf("Введите систему счисления: ");
scanf("%d",&sys);
printf("Введите число: ");
scanf("%d", &binary);
switch (sys)
{
case 10:
n1=binary/2;
n2=binary%2;
n3=n1/2;
n4=n1%2;
n5=n3/2;
n6=n3%2;
n7=n5/2;
n8=n5%2;
n9=n7/2;
n10=n7%2;
n11=n9/2;
n12=n9%2;
n13=n11/2;
n14=n11%2;
n15=n13/2;
n16=n13%2;
n17=n15/2;
n18=n15%2;
n19=n17/2;
n20=n17%2;
n21=n19/2;
n22=n19%2;
n23=n21/2;
n24=n21%2;
printf("%d%d%d%d%d%d%d%d%d%d%d%d\n",n24,n22,n20,n18,n16,n14,n12,n10,n8,n6,n4,n2);
break;
case 2:
n1=binary%10;
n2=binary/10;
n3=n2%10;
n4=n2/10;
n5=n4%10;
n6=n4/10;
n7=n6%10;
n8=n6/10;
n9=n8%10;
n10=n8/10;
n11=n10%10;
n12=n10/10;
n13=n12%10;
n14=n12/10;
n15=n14%10;
n16=n14/10;
n17=n16%10;
n18=n16/10;
n19=n18%10;
n20=n18/10;
r=n19*512+n17*256+n15*128+n13*64+n11*32+n9*16+n7*8+n5*4+n3*2+n1*1;
printf("Ваше число: %d\n",r);
break;
}
getch();
}

Re: Алгоритм разложения числа на цифры.

Добавлено: Вс дек 26, 2010 13:31:06
WandererSc
Всю тему не читал, расскажу как знаю.

Первый способ - перевести число в строку, потом брать по одному символу из этой строки. Так делали в универе.
Второй способ - отнимать еденицы\десятки\сотни и т.д. и при этом считать сколько чего отнято например как здесь http://www.pcports.ru/articles/avr4.php

Re: Алгоритм разложения числа на цифры.

Добавлено: Вс дек 26, 2010 13:38:58
ploop
Но, почти везде говорится, что лучше рекурсивными функциями не пользоваться, так как они сильно замедляют работу программы, чего мне очень не хочется.
Это где так говорится? Там, где миллионы итераций используется - да, замедлит, и сильно нагрузит стек. А если с умом использовать - только ускорит.

По теме - большое число разложить можно только одним способом - представить в виде строки, как и сказал WandererSc. Да по другому и не получится (смотрите ограничения на типы данных)

Re: Алгоритм разложения числа на цифры.

Добавлено: Пн дек 27, 2010 15:32:00
kalobyte

Re: Алгоритм разложения числа на цифры.

Добавлено: Пн дек 27, 2010 15:54:56
ARV
достали уже с 2-я вещами: :kill:
1. постоянным упоминанием С++ там, где речь идет о чистейшем С - вы вообще разницу между этими языками понимаете?!
2. переводом чисел... уже, блин, тошнит - столько всего на эту тему понаписано, и тем не менее всякий раз она всплывает, как дерьмо в проруби...

P.S. рекурсия, может быть, и не замедляет ничего, зато стек и память жрет - любо-дорого! я бы не советовал увлекаться в микроконтроллерных системах рекурсией, особенно если:
1) нет четкого понимания, что к чему и как оно воообще работает
2) нет заранее известной максимальной глубины погружения в рекурсию.

я пока ограничиваюсь рекурсией в 2 погружения, редко - в три, да и то с учетом надежды на оптимизацию компилятора, который такие рекурсии разворачивает в линейный код.

Re: Алгоритм разложения числа на цифры.

Добавлено: Пн дек 27, 2010 16:10:18
-=SY=-
для МК самый быстрый и минимально "жрущий" память - это отнимать сотни, десятки, единицы и считать количество этих итераций соответственно для каждого разряда.

Re: Алгоритм разложения числа на цифры.

Добавлено: Пн дек 27, 2010 16:16:09
ARV
-=SY=- писал(а):для МК самый быстрый и минимально "жрущий" память - это отнимать сотни, десятки, единицы и считать количество этих итераций соответственно для каждого разряда.
я всегда делал так, и не замечал ни тормозов, ни нехватки памяти... боюсь, что такая погоня за скоростью похожа на бой с тенью: устать можно, а победить нельзя...

Re: Алгоритм разложения числа на цифры.

Добавлено: Пн дек 27, 2010 16:29:18
-=SY=-
ARV писал(а):я всегда делал так
кстати, оригинально.

Re: Алгоритм разложения числа на цифры.

Добавлено: Пн дек 27, 2010 16:46:09
ploop
А тут тема про МК? Я думал автор решает задачки просто по прикладному программированию (в свете его недавних вопросов в других темах)

Re: Алгоритм разложения числа на цифры.

Добавлено: Пн дек 27, 2010 17:07:33
Pika4u
Кстати, да. Нафига мне тут про МК, если программы для компьютера пишу? :))) :))) :))) :)))

Re: Алгоритм разложения числа на цифры.

Добавлено: Пн дек 27, 2010 17:15:00
-=SY=-
Pika4u писал(а):Кстати, да. Нафига мне тут про МК, если программы для компьютера пишу? :))) :))) :))) :)))
А внутри твоего компьютера что, пенопласт???

Re: Алгоритм разложения числа на цифры.

Добавлено: Пн дек 27, 2010 17:21:03
Pika4u
Неа. Мой комп целиком состоит из булочек и конфет)) :))) :))) :)))

Re: Алгоритм разложения числа на цифры.

Добавлено: Пн дек 27, 2010 20:12:33
DX168B
А может проще?

Код: Выделить всё

#include <stdio.h>
#include <conio.h>
#include <display.h> //Это мой личный заголовочник, по этому не ищите его нигде.

void main(void)
{
	int numb=0;
	char result0[30];
	char result1[50];
	display("Введите число в десятичном формате:");
	cin >> numb;
	itoa(numb, result0, 2);
	sprintf(result1, "Результат в двоичном формате: %s", result0);
	display(result1);
	itoa(numb, result0, 8);
	sprintf(result1, "Результат в восьмиричном формате: %s", result0);
	display(result1);
	itoa(numb, result0, 16);
	sprintf(result1, "Результат в шестнадцатиричном формате: %s", result0);
	display(result1);
	_getch();
}
Готовая функция itoa(int num, char *res, int numsys); переведёт тебе любое число в любую систему счисления. Если конечно под Винду программируешь.

Re: Алгоритм разложения числа на цифры.

Добавлено: Вт дек 28, 2010 04:31:16
Foks
-=SY=- писал(а):
ARV писал(а):я всегда делал так
кстати, оригинально.
А что собственно оригинально? С математической точки зрения задача именно так и решается, и реализована там "в лоб".