Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.09.2012, 19:07   #1
Свитозар
Новичок
Джуниор
 
Регистрация: 26.09.2012
Сообщений: 2
По умолчанию Длинная арифметика

Проблема со следующей функцией умножения(fatal error LNK1120: 1 неразрешенных внешних элементов) :
Код:
unsigned long int* multipl(unsigned long int* a,unsigned long int* b)
{
	unsigned long int* r=new unsigned long int[1000]; //result
	int q=HighBitNumber(a);
	int p=HighBitNumber(b);
	if((q==0)&&(p==0))
	{
		r[0]=a[0]*b[0];
		r[1]=-1;
		return r;
	}
	if((q==1)&&(p==1))
	{
		r[0]=a[0]*b[0];
		unsigned long int* s=new unsigned long int[2];
		s[0]=a[1]*b[0];
		s[1]=-1;
		unsigned long int* d=new unsigned long int[2];
		d[0]=a[0]*b[1];
		d[1]=-1;
		unsigned long int* sum=new unsigned long int[2];
		sum=plus_32(s,d);
		r[1]=s[0];
		if(s[1]!=-1) r[2]=a[1]*b[1]+s[1];
		else r[2]=a[1]*b[1];
		r[3]=-1;
	}
	else
	{
	//сделаем из входных чисел числа длины 2n (k)
	int k=max(q+1,p+1);
	if(k%2==1) k=k+1;
	int i=q;
	while(i++<k-1) a[i]=0;  //пока не пришли к последнему необходимому биту
	a[i]=-1;
	
	i=p;
	while(i++<k-1) b[i]=0;
	b[i]=-1;
	i=0;
	cout<<"\nnow a is: \n";
	writing(a);
	cout<<"\nnow b is: \n";
	writing(b);
	//теперь сделаем из них по два числа длины n
	int n=k/2;
	unsigned long int* a1=new unsigned long int[n];
	for(int i=0;i<n;i++) a1[i]=a[n+i];
	a1[n]=-1;
	unsigned long int* a0=new unsigned long int[n];
	for(int i=0;i<n;i++) a0[i]=a[i];
	a0[n]=-1;
	unsigned long int* b1=new unsigned long int[n];
	for(int i=0;i<n;i++) b1[i]=b[n+i];
	b1[n]=-1;
	unsigned long int* b0=new unsigned long int[n];
	for(int i=0;i<n;i++) b0[i]=b[i];
	b0[n]=-1;
	//сделано. используем алг.Карацубы
	unsigned long int* r1=new unsigned long int[4*n];
	unsigned long int* r2=new unsigned long int[3*n];
	unsigned long int* r3=new unsigned long int[3*n]; // это вспомогательные массивы
	
	r1=multipl(a1,b1);
	unsigned long int* r1h=new unsigned long int[4*n];
	for(int i=2*n-1;i>-1;i--) r1h[i+2*n]=r1[i];
	for(int i=0;i<2*n;i++) r1h[i]=0;

	unsigned long int* r1l=new unsigned long int[3*n];
	for(int i=2*n-1;i>-1;i--) r1l[i+n]=r1[i];
	for(int i=0;i<n;i++) r1l[i]=0;
	r1=plus_32(r1h,r1l);

	r3=multipl(a0,b0);
	unsigned long int* r3h=new unsigned long int[3*n];
	for(int i=2*n-1;i>-1;i--) r3h[i+n]=r3[i];
	for(int i=0;i<n;i++) r3h[i]=0;
	r3=plus_32(r3h,r3);

	r=plus_32(r1,r3);

	}
	return r;
}


________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 26.09.2012 в 19:58.
Свитозар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Длинная арифметика Khelleos Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 20.12.2010 09:08
длинная арифметика Dimarik Общие вопросы C/C++ 1 16.09.2009 12:02
Длинная арифметика DmT Помощь студентам 2 06.10.2007 22:43