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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2013, 19:47   #1
Леопольдовна
Пользователь
 
Регистрация: 03.04.2013
Сообщений: 17
Восклицание Длинная арифметика. Двусвязый список

Создать тип данных Многоразрядное число. Разработать следующие функции:
• LongSumLong() – сложение двух многоразрядных чисел;
• LongSubLong() – вычитание двух многоразрядных чисел;
• LongMulLong() – умножение двух многоразрядных чисел;
• LongDivLong() – деление двух многоразрядных чисел.

Короче, я уже написал первые три операции (код ниже). Помогите с последней, деление не знаю, как написать
Код:
/* Структура, описывающая элемент двунаправленного списка */ 
typedef struct item 
{  
	int digit;   
	struct item *next;   
	struct item *prev; 
} Item;
 
/* Структура, описывающая многоразрядное число */ 
typedef struct mnumber 
{   
	Item *head;   
	Item *tail;   
	int n; 
} MNumber;

MNumber CreateMNumber(char *initStr); 
void AddDigit(MNumber *number, int digit); 
void PrintMNumber(MNumber number); 
MNumber SumMNumber(MNumber n1, MNumber n2);
MNumber RaznMNumber(MNumber n1, MNumber n2);
MNumber MultiplMNumber(MNumber n1, MNumber n2);

int _tmain(int argc, _TCHAR* argv[])
{   
	MNumber a = CreateMNumber("1234");   
	MNumber b = CreateMNumber("1234");   
	MNumber c = SumMNumber(a, b);
	MNumber d = RaznMNumber(b, a);
	MNumber e = MultiplMNumber(a, b);
	PrintMNumber(a);   
	PrintMNumber(b);
	printf("\nSummary\t");
	PrintMNumber(c);
	printf("\nRaznost\t");
	PrintMNumber(d);
	printf("\nMultiplication\t");
	PrintMNumber(e);


	getchar();

	return 0;
 } 

/* Создает многоразрядное число из цифр строки */ 
MNumber CreateMNumber(char initStr[]) 
{   
	MNumber number = {NULL, NULL, 0};   
	int n;  
	for (n = strlen(initStr)-1; n >= 0; n--)
	{
		AddDigit(&number, initStr[n]-'0');
	}

	return number; 
}

/* Добавляет цифру в многоразрядное число */
 void AddDigit(MNumber *number, int digit) 
{   
	Item *p = (Item *)malloc(sizeof(Item));   
	p->digit = digit;   
	p->next = p->prev = NULL;

	if (number->head == NULL)
	{
		number->head = number->tail = p; 
	}

	else
	{       
		number->tail->next = p;      
		p->prev = number->tail;       
		number->tail = p;     
	} 
    number->n++;
}

 /* Возвращает сумму двух многоразрядных чисел */
 MNumber SumMNumber(MNumber n1, MNumber n2)
{   
	MNumber sum = CreateMNumber("");  
	Item *p1 = n1.head, *p2 = n2.head; 
	int digit, pos = 0, s1, s2;  

	while (p1 || p2) 
	{     
		if (p1)
		{ 
			s1 = p1->digit;
			p1 = p1->next;
		} 

		else s1 = 0;  

		if (p2)
		{ 
			s2 = p2->digit;
			p2 = p2->next; 
		}

		else s2 = 0;  

		digit = (s1 + s2 + pos) % 10; 
		pos = (s1 + s2 + pos) / 10;    
		AddDigit(&sum, digit);  
	}   

	if (pos) AddDigit(&sum, pos);

	return sum;
 }

  /* Возвращает разность двух многоразрядных чисел */
 MNumber RaznMNumber(MNumber n1, MNumber n2)
{   
	MNumber razn = CreateMNumber("");  
	Item *p1 = n1.head, *p2 = n2.head; 
	int digit = 0, pos = 0, s1 = 0, s2 = 0;  

	while (p1 || p2) 
	{     
		if (p1)
		{
			if((s1 - s2) >= 0) s1 = p1->digit; 	
			else s1 = p1->digit - 1;
			p1 = p1->next;
		} 
		else s1 = 0;  

		if (p2)
		{ 
			s2 = p2->digit;
			p2 = p2->next; 
		}
		else s2 = 0; 

		if ((s1 - s2) >= 0) digit = (s1 - s2 + pos) % 10;
		else digit = (10 + s1 - s2 + pos) % 10;

		pos = (s1 + s2 + pos) / 10;    
		AddDigit(&razn, digit);  
	}   

	if (pos) AddDigit(&razn, pos);

	return razn;
 }

 /* Возвращает произведение двух многоразрядеых чисел*/
 MNumber MultiplMNumber(MNumber n1, MNumber n2)
 {
	MNumber mult_ = CreateMNumber(""), mult = CreateMNumber("0");  
	Item *p1 = n1.head, *p2 = n2.head; 
	int digit = 0, pos = 0, s1 = 0, s2 = 0, i = 0 , k = 0;

	while (p1) 
	{     
		s1 = p1->digit; 
		mult_ = CreateMNumber("");
		p2 = n2.head;
		k = 0;
		while (p2)
		{
			s2 = p2->digit; 
			if (k != i)
			{
				for(k = 0; k < i; k++)
				{
					AddDigit(&mult_, 0);
				}
			}
			digit = (s1 * s2 + pos) % 10;
			pos = (s1 * s2 + pos) / 10;    
			AddDigit(&mult_, digit);
			p2 = p2->next;
			if ((pos > 0) && (p2 == NULL)) AddDigit(&mult_, pos);
		}
		mult = SumMNumber(mult, mult_);
		p1 = p1->next;
		i++;
	}   

	return mult;
 }

  /* Возвращает частное и остаток от деления двух многоразрядных чисел */
 MNumber SumMNumber(MNumber n1, MNumber n2)
{   
	MNumber chast = CreateMNumber(""), ost = CreateMNumber(""), temp = RaznMNumber(n1, n2);

	while(RaznMNumber(RaznMNumber(temp, n2), n2))
	{
		temp = RaznMNumber(temp, n2);

	}

	return chast;
 }

/* Выводит многоразрядное число на экран */ 
void PrintMNumber(MNumber number)
{    
	Item *p = number.tail, *temp = number.tail;  

	printf("\nNumber: "); 

	while (p)
	{ 
		if((temp->digit == 0) && (p->prev != NULL))
		{
			temp = temp->prev;
			p = p->prev;
		}
		else
		{
			printf("%d", p->digit);     
			p = p->prev;
		}
	}

	free(p);
}
Леопольдовна вне форума Ответить с цитированием
Старый 18.04.2013, 20:52   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Деление выполняется алгоритмом в столбик.
s-andriano вне форума Ответить с цитированием
Старый 18.04.2013, 21:21   #3
Леопольдовна
Пользователь
 
Регистрация: 03.04.2013
Сообщений: 17
По умолчанию

Спасибо, вроде как работает
Леопольдовна вне форума Ответить с цитированием
Старый 29.04.2013, 21:50   #4
_natalia_
Новичок
Джуниор
 
Регистрация: 25.04.2013
Сообщений: 1
Печаль

ничего не работает
_natalia_ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Длинная арифметика Свитозар Помощь студентам 0 26.09.2012 19:07
C# Длинная арифметика _Varyag_ Помощь студентам 23 21.02.2012 19:33
Длинная арифметика morgan97 Паскаль, Turbo Pascal, PascalABC.NET 0 04.12.2011 20:03
Длинная арифметика 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