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

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

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

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

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

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

Привет.
Я пишу сейчас длинную арифметику.
Сложение,вычитание и все дополнительные функции(сдвиг,нахождение старшего бита...) работают коректно.
Конец числа определяеться -1.
Числа храняться в системе исч. 2^12 .
Умножение я сделал алгоритмом Карацубы.
И с ним проблема : при небольших входных числах всё правильно,а при длинных числах(256 бит,например) ошибка памяти : поврежнение кучи.
Помогите разобраться пожалуйста!
уже неделю бьюсь над этим(
Вот код:
Код:
int* multipl(int* a,int* b)
{
	int k=16*16*16-1;//максимальное значение розряда 2^12
	int* r=new int[1000]; //result
	int q=HighBitNumber(a);
	int p=HighBitNumber(b);

	if((q==0)&&(p==0))
	{
		r[0]=a[0]*b[0];
		if(r[0]>k)
		{
			int m; //вспомогательная пер.
			m=r[0]%(k+1);
			r[1]=(r[0]-m)/k;
			r[0]=m;
			r[2]=-1;
		}
		else r[1]=-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;

	//теперь сделаем из них по два числа длины n
	int n=k/2;
	int* a1=new int[n+1];
	for(int i=0;i<n;i++) a1[i]=a[n+i];
	a1[n]=-1;
	int* a0=new int[n+1];
	for(int i=0;i<n;i++) a0[i]=a[i];
	a0[n]=-1;
    int* b1=new int[n+1];
	for(int i=0;i<n;i++) b1[i]=b[n+i];
	b1[n]=-1;
	int* b0=new int[n+1];
	for(int i=0;i<n;i++) b0[i]=b[i];
	b0[n]=-1;

	//сделано. используем алг.Карацубы
	int* r1=new int[1000];
	int* r2=new int[1000];
	int* r3=new int[1000]; // это вспомогательные массивы
	
	r1=multipl(a1,b1);

	int* r1h=new int[1000];
	r1h=shift(r1,2*n);

	int* r1l=new int[1000];
	r1l=shift(r1,n);
	r1=plus_12(r1h,r1l);
	
	r3=multipl(a0,b0);

	int* r3h=new int[1000];
	r3h=shift(r3,n);

	r3=plus_12(r3h,r3);

	r=plus_12(r1,r3);

	int* m1=new int[1000];
	m1=minus_12(a1,a0);
	int* m2=new int[1000];
	m2=minus_12(b0,b1);

	if((m1[0]==-1)&&(m2[0]==-1))
	{
		r2=multipl(minus_12(a0,a1),minus_12(b1,b0));
		r2=shift(r2,n);
		r=plus_12(r2,r);
	}
	else if (m1[0]==-1) 
	{	
		r2=multipl(minus_12(a0,a1),m2);
		r2=shift(r2,n);
		r=minus_12(r,r2);
	}
	else if (m2[0]==-1) 
	{	
		r2=multipl(m1,minus_12(b1,b0));
		r2=shift(r2,n);
		r=minus_12(r,r2);
	}
	else
	{	
		r2=multipl(m1,m2);
		r2=shift(r2,n);
		r=plus_12(r,r2);
	}

	}
	return r;
	}
Если нужно-могу сбросить код остальных функций.

Последний раз редактировалось Stilet; 27.10.2012 в 18:37.
Свитозар вне форума Ответить с цитированием
Старый 27.10.2012, 18:29   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

1) Используйте отладчик для определения точки падения программы.
2) Структурируйте программу. Сейчас метод слишком большой, в нём много переменных с неговорящими названиями, а переменная k объявлена дважды. Такой стиль провоцирует ошибки и уничтожает Вашу возможность модифицировать код спустя некоторое время.
3) new[] вижу, delete[] не вижу. Одна из возможных причин описанной ошибки - освобождение памяти, выделенной специальной формой оператора new[], оператором delete, а не delete[].
Abstraction вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача по целочисленной арифметике Gamst Помощь студентам 8 24.06.2012 11:05
вопрос по адресной арифметике Dimanw92 Общие вопросы C/C++ 4 21.05.2012 21:58
ошибка в арифметике Figushkin Помощь студентам 1 09.06.2010 07:11
Проблемы с виртуальной памятью. DeKot Операционные системы общие вопросы 13 29.05.2009 11:10
Вопрос по адресной арифметике и Message в консольных приложениях Enikov Помощь студентам 5 01.01.2009 19:44