单变量多项式加法

时间:2013-09-03 18:52:19

标签: c polynomial-math

我必须用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

2 个答案:

答案 0 :(得分:2)

我已阅读您的代码。

你在addPolyomials函数中有内存问题 这个问题导致了错误的错误: Leeor 已经在他的答案中给出了解决方案:您需要在第2和第3 else之前添加单词if
如果不这样做,则当第一个if为TRUE时,会创建一个新指针并将其添加到列表中,并且提前完成

因此,当达到第二if时,使用这些新的高级指针完成比较。
这是一个逻辑错误。

通过对程序进行此更改,还存在一些问题。

由于您将polynomial3初始化为垃圾,因此会在最终结果中显示 也许你必须初始化组件exp和coef(到0?)。

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

当您“创建”多项式2时,main()出错 在那里,您正在使用列表多项式1 该行必须更改为:

            polynomial2 = addTerm(polynomial2,exp,coef);

随着这些变化,我们可以观察程序的逻辑本身 我得到了一个无意义的解决方案 我认为你定义一些“待定”标志的想法是不够的。

你的逻辑似乎认为多项式就好像它们是有序的指数一样 但是用户不会以这种方式输入多项式 您问题顶部的示例使指数无序(第一个多项式)。

我认为在输入列表时处理您的列表可能是个好主意,将这些条款按顺序排列。由于这些术语是一次添加的,因此可以通过从列表顶部搜索并正确插入术语来轻松实现。 例如,如果您有5x^2 + 6x^3 + 9,则第一步将在列表多项式1的顶部插入5 2。在下一次迭代中,对6 3将再次插入顶部,在对(5,2)之前,依此类推。你的最终名单是:

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

此过程可确保您可以根据需要进行迭代。 (有一个小问题:如果用户输入重复指数会发生什么?在这种情况下,没有新元素添加到列表中:只需添加新系数!)

最后,我们可以分析总和中“未决”的系数问题 注意,只有当两个列表都不为NULL时,while()才会迭代 当while()到达目的地时,只有三种情况可能:

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

检查(polynomial1!= NULL)和(polynomial2!= NULL)就足够了。
在第一种情况下,只需将多项式1的待定项“粘贴”到多项式3即可 在第二种情况下,对多项式2执行相同的操作。

最后,在显示功能中,您可以更好地处理系数为0的术语 可能最好不显示系数为0的术语。

您的计划需要更多改进,但这超出了您的问题范围。

答案 1 :(得分: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)

中遍历它们