|
|
| Посл.отвђт | Сообщен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 |