· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.A&O —› Перевод большого числа в 2-ю с/с .

Посл.отвђт Сообщенiе


Дата: Янв 19, 2004 22:20:16

Привет всем .Помогите написать ,пожалуйста ,процедуру или функцию перевода больших целых чисел из 10-й с/с в 2-ую .Число дано в виде строки.Длина числа <= 255 знаков . Например:s1='1212212187773647646700094000054657780037' нужно перевести в 2-ую с/с.


Дата: Янв 19, 2004 22:40:45

Подсказка: можно перевести в BCD...


Дата: Янв 19, 2004 22:45:11

http://www.danbbs.dk/~erikoest/hex.htm - общая теория.
Базируется на полиномах. Приду домой - поищу программу для перевода из любой в любую. Где-то была. Общее описание алгоритма тут:

http://www2.ics.hawaii.edu/~esb/1998fall.ics312/sep14.html

Но, ей-богу, мне было бы стыдно такую просьбу в A&О постить :(


Дата: Янв 24, 2004 03:51:51

Мне бы побыстрее прогу хоть какую увидеть!? My excuses for time.


Дата: Янв 24, 2004 12:10:09

Seiphirot


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


Дата: Янв 25, 2004 06:46:18

Valery
Может знаешь как 15-ое совершенное число найти ?


Дата: Янв 25, 2004 12:29:22

Seiphirot

Не знаю. А при чем тут десятичные числа?


Дата: Янв 25, 2004 21:04:16

Он видимо хочет внести наибольшее известное ему простое.
И посчитать по Эвклиду. (2^p - 1) 2^(p-1)
Но у него ничтожно малое число десятичное. Уже настолько большие Мерсеновские числа найденны что ограничение по 255 максимальных знаков просто смешно.


Дата: Янв 25, 2004 23:05:50

The Svin
А что за Мерсеновские числа ?Please просветите ?


Дата: Янв 26, 2004 02:34:52

Дядька такой был француз - Мерсен. Клуб держал любителей математики, в частности Декарт, Ферма и Паскаль были членами этого клуба и вели через него переписку.
Предложил поиск простых чисел по схеме 2^n-1.
Потом оказалось что не все такие простые. Но по традиции если 2^n-1 оказалось простым называют числом Мерсена. Я уже не слежу за новыми числами но в 97ом было доказано что простое при n = 2976221. Раздели на 10 умножь на три получишь сколько будет знаков в десятичной приблизительно.


Дата: Янв 26, 2004 03:16:31

The Svin
Thanks !Не знал раньше про Мерсена и его клуб .У Ширяева спрошу об этом .Интересно про клуб математиков узнать побольше .
The Svin,спасибо за информацию.Любителей истории в математике не так уж много .


Дата: Янв 26, 2004 08:30:19

Пожалуйста, маленькое замечание - если вдруг захочешь перевести Месреновское число в двоичную :)
Это просто n единичных бит.


Дата: Фев 1, 2004 06:52:06

Ты просил программу. Возле и около нее я начинал свое изучение С. 2 года назад... :) Эх, память, память.
# include <stdio.h>
# include <string.h>
# include <search.h>
# define MAXZIF 25
char s[]="0123456789ABCDEF";
void deci_b();
void per_arr();
/* */
main()
{
	char res[MAXZIF];
	char temp,d[MAXZIF],*s1;
	int i,n,p[MAXZIF];
	long num;
	short base,newbase,nr;

	printf("\nВведите число: " );
	scanf("%s", d);
	printf("\nВведите основание:");
	scanf("%d",&base);
	printf("\nВведите новое основание:");
	scanf("%d",&newbase);

	n=strlen(d);
	for (i=0;i<=n;i++)
	{
	temp=d[i];
	s1=strchr(s,temp);
	if (s1==NULL)
	   {   printf("Символ цифры неверен !!!");
	       return(3);
	   }
	   else p[i]=s1-s;
	 }
	 num=p[0];
	 for (i=0;i<=n-2;i++)
	num=num*base+p[i+1];
	  printf("Число в 10-системе = %ld\n", num);

	  /* Перевести число в другое основание */

	  deci_b(num,newbase,res);
	  nr=strlen(res);
	  printf("Число в %d - системе равно ",newbase);
	for (i=0;i<=nr-1;i++)
	    printf("%c",res[i]);


}
void per_arr(a,n)
/*  перестановка элементов массива*/
	int n;
	char a[];
{
	int i,j, b;
	for ( i=0, j=n-1; i<n/2;
	      b=a[i], a[i]=a[j], a[j]=b, i++,j-- );
}

void deci_b(num,newb,res)
/* Десятичное число num записывается по основанию newb */
/*   в массив  res[0..k-1]*/
   long int num;
   short int newb;
   char res[];
{ short int l,k;
   for(k=0;k<MAXZIF; ++k,res[k]='\0');
	k=-1;
	do
	{ k++;
	 l= num % newb;
	 res[k]=s[l];
	 num = num / newb ; }
	while (num >= newb);

	k++; l=num; res[k]=s[l];
	k++;
	per_arr(res,k);
}



Дата: Фев 1, 2004 08:28:32

Это число которое Seiphirot дал в long же не поместитса


Дата: Фев 1, 2004 21:43:38 · Поправил: The Svin

848и битная переменная нужна будет для результата.
Это ~ 27 двойных слов.
Если учитывать что может быть максимальное значение ((10^255) -1)
А сам алгоритм такой же как и с любым другим размером
1. Кладём в x НУЛЬ.
2. Устанавливаем указатель на начало ASCIIZ строки.
Переходим к шагу 6.

3. Извлекаем из символа под указателем цифру (пусть будет y):
байт and not 30h или байт - 30h.
4. x=10x+y
5. Увеличиваем указатель
6. Байт под указателем 0? Нет переходим на шаг 3.

Значит, в чём сложности тут могут быть для новичков:
Умножение на неподдерживаемое внутренне процессором офигенно
битное число и сложение с ним.
В данном случае умножение может быть сдвигово-сложением (образ сдвинутый на
3 (*8) + образ сдвинутый на 1 (*2) Поскольку число офигенное,
shl прийдётся чередовать с shld.
Я бы сделал так - скопировал образ, сдвинул на 2(*4) прибавил
сохранённый, потом полученный результат сдвинул ещё на 1.
Прибавлять части нужно разумеется с ADC.

Или последовательное умножение через mul на константу.
Со сложением переноса в edx со следующей частью числа, при этом
нужно учитывать что при любом таком сложении может получится перенос
который нужно учитывать через ADC x[next],0 пока CF не окажется сброшенным.
Прибавление к полученному результату 10х y'ка также нужно делать с учётом CF
если он 1 то продолжать прибавлять к следующим частям x пока он не будет равен
0.

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


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.061