2013-09-03 3 views
0

Мне нужно написать программу на C, в которой мне нужно добавить два одномодовых полинома. Я могу сделать это частично, и я получаю неправильный ответ.Добавление одно переменных полиномов

Рассмотрим два полинома:

5x^2 + 6x^3 + 9 
6x^3 + 5x^2 + 3x + 2 

Я знаю, что ответ будет вручную. Вот моя логика:

if(term1->exp == term2->exp){ // same power of x 
    // add them, store them in the final answer linked list 
    // increment pointers of both the term1 and term2 linkedlist 
} 
if(term1->exp > term2->exp){ // term1 has higher power of x than term2 
    // increment term1 linked list in search of lower power of x 
    // ** term1 is now pending ** 
} 

if(term1->exp < term2->exp){ // term1 has lesser power of x than term2 
    // increment term2 linked list in search of lower power of x 
    // ** term2 is now pending ** 
} 

Проблема, с которой я сталкиваюсь, заключается в ожидании условий. Как я могу позаботиться об ожидающих условиях?
Как их правильно добавить?

код здесь: http://pastebin.com/70UJdNiQ

+5

Отправьте код, который дает неверный ответ. – WhozCraig

+0

В кратком фрагменте у вас мало контекста, на который можно ответить. Вам нужно показать, как ваш код проходит через термины и как вы захватываете полученный полином. – lurker

+1

Задайте вопрос, как решить проблему с помощью бумаги. Затем обновите вопрос с помощью кода, реализующего этот алгоритм. Затем обновите вопрос с тем, что не так в коде, о котором у вас есть вопросы. – dcaswell

ответ

1

Вы не должны продвигать член с высшей силой, если она выше (и при условии, списки сортируются с нисходящих полномочиями), чем вы можете просто добавить его в окончательный ответ и сделайте с ним - вы знаете, что в другом списке не будет никакого термина, чтобы соответствовать этому. В псевдо -

if (term1->exp == term2->exp) { add and store, advance both } 
else if (term1->exp > term2->exp) { add term1 to the result list and advance it } 
else { add term2 to the result list and advance it } 

то просто иметь дело со списком, который имеет остатки (меньшие сроки)

В случае списки не отсортированы, обратите внимание, что для поиска совпадений для каждого члена вы должны будете заплатите O (N^2), рассмотрите сначала сортировку обоих списков (для более низкого штрафа O (NlogN)), а затем выполните их, как указано выше, в O (N)

2

Я прочитал ваш код.

У вас есть проблемы с памятью внутри функции addPolyomials.
Эта проблема вызвана неправильной логикой: Leeor дал вам решение в своем ответе: вам нужно добавить слова else до 2-го и 3-го if s.
Если вы этого не сделаете, тогда, когда 1-й, если дает TRUE, создается новый указатель и добавляется в список, а сделан шаг.

Таким образом, когда достигается 2-й if, сравнение выполняется с помощью этих новых продвинутых указателей.
Это логическая ошибка.

Делая это изменение на программу, есть некоторые проблемы.

Поскольку вы инициализируете polyomial3 для мусора, это показано в конечном результате.
Возможно, вам также нужно инициализировать компоненты exp и coef (to 0?).

 polynomial3->exp = 0; 
     polyoomial3->coef = 0; 

У вас ошибка в main() при "создании" polynomial2.
Там вы используете список polyomial1.
линия должен быть изменено:

  polynomial2 = addTerm(polynomial2,exp,coef); 

С тезисами изменениями, мы можем наблюдать логик себя программу.
Я получил бессмысленное решение.
Я думаю, что вашей идеи определения некоторого «ожидающего» флага недостаточно.

Ваша логика, кажется, рассматривает полиномы, как если бы они были показателями по порядку.
Но пользователь не будет вводить полиномы таким образом.
Ваши примеры в верхней части вашего вопроса имеют неупорядоченные экспоненты (первый многочлен).

Я думаю, что было бы неплохо обработать ваши списки в момент их ввода, введя условия в порядок. Поскольку термины добавляются по одному в то время, это можно легко достичь, выполнив поиск в списке сверху и правильно вставляя термины.
Например, если у вас есть 5x^2 + 6x^3 + 9, первый шаг будет вставлять 5 2 в верхней части списка polyomial1. На следующей итерации пара 6 3 будет вставлена ​​снова вверху, перед парой (5, 2) и т. Д. Ваш окончательный список будет:

(6, 3, next), (5, 2, next), (9, 0, next), NULL 

Эта процедура гарантирует, что вы можете выполнять итерацию по своему усмотрению. (Существует небольшая проблема: что произойдет, если пользователь вводит повторный показатель? В этом случае новый элемент не добавляется в список: просто добавьте новый коэффициент!)

Наконец, мы можем проанализировать «ожидающие рассмотрения», коэффициенты задаются в сумме.
Обратите внимание, что ваш while() выполняет итерацию только в том случае, если оба списка не являются NULL.
Когда while() приходит к своему концу, только три ситуации:

  (polynomial1 != NULL && polynomial2==NULL) 
or well (polynomial2 != NULL && polynomial1==NULL), 
or well both are NULL. 

Достаточно проверить (! Polynomial1 = NULL) и (polynomial2! = NULL).
В первом случае просто «вставьте» ожидающие члены полинома1 в полином 3.
Во втором случае сделайте то же самое для polyomial2.

И, наконец, в функции дисплея вы можете лучше обращаться с терминами с коэффициентом 0.
Наверное, лучше, чтобы члены с коэффициентом 0 не были показаны.

Ваша программа нуждается в гораздо большем улучшении, но это выходит за рамки вашего вопроса.

+0

Я собираюсь решить 'Leeor' решение сортировки :) –

Смежные вопросы