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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2018, 12:39   #1
HelloVikiend
Пользователь
 
Регистрация: 02.11.2017
Сообщений: 33
Восклицание Си Сложить два длинных целых числа

Нужна помощь в написании программы.
Получить сумму двух длинных целых чисел. Числа и результат представлены линейными двусвязными списками
Вводим два числа и потом их нужно сложить и вывести результат

Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct _list {
     int value;
       _list* next;
       _list* prev;
} list;
 
void add(list** head, list** tail, int value) {
       list* p = new list;
       p->next = NULL;
       p->prev = NULL;
p->value=value;
 
       if(*head == NULL)
             *head = *tail = p;
       else {
             (*tail)->next = p;
             p->prev = *tail;
             *tail  = p;
       }
}
 
int main()
{
    
    list* i,*head = NULL, *tail=NULL;
    int x,val;
    scanf("%d", &x);
    while(x!=-9999)
    {
      add(&head, &tail, x);
    scanf("%d", &x);}
         for(i = head; i != NULL; i = i->next)
                printf("%d", i->value);
}
HelloVikiend вне форума Ответить с цитированием
Старый 04.06.2018, 12:58   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

И? В школу ходили? Числа столбиком складывали?
p51x вне форума Ответить с цитированием
Старый 04.06.2018, 13:00   #3
HelloVikiend
Пользователь
 
Регистрация: 02.11.2017
Сообщений: 33
По умолчанию

Я не понимаю работу двусвязных списков, нам их можно сказать толком не объяснили, а просто дали задание на практике, все что я понял с интернета это только как добавить удалять элементы, я не понимаю как сложить два невероятно больших числа
HelloVikiend вне форума Ответить с цитированием
Старый 04.06.2018, 13:26   #4
HelloVikiend
Пользователь
 
Регистрация: 02.11.2017
Сообщений: 33
По умолчанию

Вот я добавляю два числа, через циклы, допустим, но как их складывать? я не понимаю с чего начинать

Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct _list {
     int value;
     int value2;
       _list* next;
       _list* prev;
} list;

void add(list** head, list** tail, int value) {
       list* p = new list;
       p->next = NULL;
       p->prev = NULL;
p->value=value;

       if(*head == NULL)
             *head = *tail = p;
       else {
             (*tail)->next = p;
             p->prev = *tail;
             *tail  = p;
       }
}

void add1(list** head, list** tail, int value2) {
       list* p = new list;
       p->next = NULL;
       p->prev = NULL;
p->value2=value2;

       if(*head == NULL)
             *head = *tail = p;
       else {
             (*tail)->next = p;
             p->prev = *tail;
             *tail  = p;
       }
}

int main()
{
	
	list* j,*i,*head = NULL, *tail=NULL;
	int x,val,x1;
	scanf("%d", &x);
	while(x!=-9999)
	{
	  add(&head, &tail, x);
	scanf("%d", &x);}
	 for(i = head; i != NULL; i = i->next)
                printf("%d\n", i->value);
                head=0,tail=0;
	scanf("%d", &x1);
	while(x1!=-9999)
	{
		add1(&head, &tail,x1);
		scanf("%d", &x1);}
		 for(j = head; j != NULL; j = j->next)
                printf("%d", j->value2);
}

Последний раз редактировалось Аватар; 04.06.2018 в 15:56.
HelloVikiend вне форума Ответить с цитированием
Старый 04.06.2018, 13:30   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от HelloVikiend Посмотреть сообщение
Я не понимаю работу двусвязных списков, нам их можно сказать толком не объяснили, а просто дали задание на практике, все что я понял с интернета это только как добавить удалять элементы, я не понимаю как сложить два невероятно больших числа
А что в них понимать? Вагоны поезда видели? Вот вам и список.

Цитата:
Сообщение от HelloVikiend Посмотреть сообщение
Вот я добавляю два числа, через циклы, допустим, но как их складывать? я не понимаю с чего начинать
С похода в школу. Там как раз рассказывают и показывают как считать:
Код:
  123432
+
  242343
-----------
p51x вне форума Ответить с цитированием
Старый 04.06.2018, 13:35   #6
HelloVikiend
Пользователь
 
Регистрация: 02.11.2017
Сообщений: 33
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
А что в них понимать? Вагоны поезда видели? Вот вам и список.


С похода в школу. Там как раз рассказывают и показывают как считать:
Код:
  123432
+
  242343
-----------
Я не об этом, алгоритм я понимаю, я не знаю как это написать, потому что без понятия что происходит в двусвязных списках
HelloVikiend вне форума Ответить с цитированием
Старый 04.06.2018, 13:51   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Да ничего в низ не происходит. Это просто набор клеточек с указателями на своих соседей.
[1] <> [2] <> [3] <> [4] <> [3] <> [2]
+
[2] <> [4] <> [2] <> [3] <> [4] <> [3]
p51x вне форума Ответить с цитированием
Старый 04.06.2018, 15:55   #8
HelloVikiend
Пользователь
 
Регистрация: 02.11.2017
Сообщений: 33
По умолчанию

Код:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
struct list {
	int field; // поле данных
	struct list *next; // указатель на следующий элемент
	struct list *prev; // указатель на предыдущий элемент
};



void add(list** first, list** tail, int value) {
	list* p = new list;
	p->next = NULL;
	p->prev = NULL;
	p->field = value;

	if (*first == NULL)
		*first = *tail = p;
	else {
		(*tail)->next = p;
		p->prev = *tail;
		*tail = p;
	}
}

void add2(list** first, list** tail, int value) {
	list* p = new list;
	p->next = NULL;
	p->prev = NULL;
	p->field = value;

	if (*first == NULL)
		*first = *tail = p;
	else {
		(*tail)->next = p;
		p->prev = *tail;
		*tail = p;
	}
}

void listprint(list *lst) 
{
	struct list *p;
	p = lst;
	do {
		printf("%d ", p->field); // вывод значения элемента p
		p = p->next; // переход к следующему узлу
	} while (p != NULL); // условие окончания обхода
}


int main() {
	list *head=NULL, *cur=NULL;
	int num,x1;
	//scanf("%d", &num);
	//head = init(num);
	//cur = head;
	scanf("%d", &num);
while(num!=-9999){
	add(&head, &cur, num);
		scanf("%d", &num);
	}
	listprint(head);
	head = NULL, cur = NULL;
	scanf("%d", &x1);
	while (x1 != -9999)
	{
		add2(&head, &cur, x1);
		scanf("%d", &x1);
	}
	listprint(head);
	return 0;
}
Немного исправил код, но не понимаю как складывать 2 числа, но я дальше этого вряд ли пройду, я знаючто там как-то по адресам нужно переходить, но я этого не понимаю

А правила почитать как код оформлять? Кнопка #
Модератор

Последний раз редактировалось Аватар; 04.06.2018 в 15:58.
HelloVikiend вне форума Ответить с цитированием
Старый 04.06.2018, 16:09   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

0. Забудьте о программировании и коде.
1. Вспомните школу и повторите пару раз, водя пальцем по цифиркам, как складываются числа в столбик.
2. Теперь представьте, что каждая цифра это элемент линейного списка.
[1] [2] [3] [4] [3] [2]
+
[2] [4] [2] [3] [4] [3]
Можете прям квадратики нарисовать. Еще раз повторяете как складывать числа. Без программирования!
3. Вспоминаете, что надо писать программу и тупо пишите алгоритм на школьном алгоритмическом языке (можно вообще словами). Прямо так и пишите: берем последнюю цифру от одного и от второго, складываем их, запоминаем перенос, сдвигаемся на ...
p51x вне форума Ответить с цитированием
Старый 04.06.2018, 16:27   #10
HelloVikiend
Пользователь
 
Регистрация: 02.11.2017
Сообщений: 33
По умолчанию

допустим имею число
[1] [2] [3]
+
[4] [5] [10]

перехожу к последним цифрам в двух числах, складываю, если они больше 10, запоминаю остаток и переношу на перед, если число больше другого, то числа на котором заканчивается какой-то число мы не трогаем и просто переносим и так с остальными, я не понимаю указатели и адреса, поэтому я не могу это написать
HelloVikiend вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Даны два целых числа A и B (A < B). Найти произведение всех целых чисел от A до B включительно. nadyaH Помощь студентам 10 29.10.2013 09:08
Сложить два 48 разрядных числа @Серж@ Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 16.12.2011 20:17
MMX сложить два числа gansm Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 13 29.10.2010 05:16
Макрос: сложить два числа белочка Microsoft Office Excel 6 23.12.2009 22:02
Сложить два числа iwaniwan Win Api 3 23.04.2009 06:27