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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

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

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

Для хранения многоразрядного числа использовать динамический двунаправленный список.

Короче, знаю, как сложение делать, потому что объяснили, помогите с отсальным. Вот мой код:
Код:
#include <stdio.h> 
  
#include <alloc.h>
 #include <string.h> 
/* Структура, описывающая элемент двунаправленного списка */ 
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);
void main(void) 
{   
MNumber a = CreateMNumber("123456789123456789");   
MNumber b = CreateMNumber("987654321987654321");   
MNumber c = SumMNumber(a, b);   
PrintMNumber(a);   
PrintMNumber(b);   
PrintMNumber(c);
 } 
/* Создает многоразрядное число из цифр строки */ 
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;
 } 
/* Выводит многоразрядное число на экран */ 
void PrintMNumber(MNumber number)
 {    
Item *p = number.tail;  
   printf("\nNumber: "); 
   while (p)
 {      
printf("%d", p->digit);     
 p = p->prev;   
 } 
}
Леопольдовна вне форума Ответить с цитированием
Старый 05.04.2013, 13:10   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Умножение - сначала разработай умножение на разряд (число от нуля до 9). Потом уже на ее основе построишь и полноценное умножение.
Я не нашел знак числа. Он есть в твоих структурах?
Код:
typedef struct item 
{  
 int digit;   
struct item *next;   
struct item *prev; 
} Item;
Оно конечно так проще, но у тебя на разряд информации затрачивается меньше чем на ссылки . Для начала или для студенческой поделки пойдет, но на будущее, надо задуматься как переделать, для более оптимального варианта модели данных
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 05.04.2013, 19:25   #3
Леопольдовна
Пользователь
 
Регистрация: 03.04.2013
Сообщений: 17
По умолчанию

Нет, я делал для положительных.
Спасибо за идею, умножение написал)
Теперь вот даже не знаю, что делать с делением? подскажите идею, пожалуйста
Леопольдовна вне форума Ответить с цитированием
Старый 06.04.2013, 06:13   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Сначала сделай вычитание. Умножение и вычитание используется в делении.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 06.04.2013, 15:24   #5
Леопольдовна
Пользователь
 
Регистрация: 03.04.2013
Сообщений: 17
По умолчанию

Я написал и вычитание, там работа со смещением была. Как теперь деление осуществить?
Леопольдовна вне форума Ответить с цитированием
Старый 06.04.2013, 17:06   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Леопольдовна Посмотреть сообщение
Я написал и вычитание, там работа со смещением была. Как теперь деление осуществить?
А столбиком делить не пробовали?
Да шо-ж такое? Арифметику третьего класса не знаем, а уже - "Мы программёры!!!!!!!!!!!". И пальцы веером... http://www.perelman100.narod.ru
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 06.04.2013 в 17:09.
Smitt&Wesson вне форума Ответить с цитированием
Старый 08.04.2013, 17:54   #7
Леопольдовна
Пользователь
 
Регистрация: 03.04.2013
Сообщений: 17
По умолчанию

Арифметика третьего класса?? ну конееечно)
Интересно, делили ли вы в третьем классе 987654321987654321987654321 на 123456789123456789123456789??
Леопольдовна вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Длинная арифметика nimfa1 Общие вопросы Delphi 4 28.06.2012 15:16
Длинная арифметика nervniy Общие вопросы Delphi 4 19.04.2011 23:18
Длинная арифметика на C++ Kingdom_Reborn Помощь студентам 0 06.04.2011 22:32