2013-09-03 4 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 단어를 두 번째 및 세 번째 앞에 추가해야합니다. if.
그렇지 않으면 첫 번째 if가 TRUE 일 때 새 포인터가 만들어져 목록에 추가되고 은 advance가 수행됩니다.

따라서 두 번째 if에 도달하면이 새로운 고급 포인터로 비교가 수행됩니다.
이것은 논리적 인 오류입니다.

프로그램을 변경하면 아직 몇 가지 문제가 있습니다.

다항식 3을 가비지로 초기화하므로 최종 결과에 표시됩니다.
아마도 성분 exp와 coef (0으로?)도 초기화해야합니다.

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

다항식 2를 만들 때 main()에 오류가 있습니다.
여기서 다항식 1을 사용하고 있습니다. 우리가 프로그램의 논리 자체를 볼 수, 논문의 변화와 함께

  polynomial2 = addTerm(polynomial2,exp,coef); 

:
라인은 변경 될 수 있습니다.
넌센스 솔루션을 얻었습니다.
"보류 중"플래그를 정의하는 아이디어가 충분하지 않다고 생각합니다.

귀하의 논리는 다항식을 지수의 순서대로 간주합니다.
그러나 사용자는이 방법으로 다항식을 입력하지 않습니다.
질문 상단의 예제에 지수가 순서가 없습니다 (첫 번째 다항식).

내가 입력 한 순간에 목록을 처리하고 용어를 순서대로 처리하는 것이 좋습니다. 용어가 한 번에 하나씩 추가되기 때문에 목록 상단에서 검색하여 용어를 올바르게 삽입하면 쉽게 달성 할 수 있습니다.
예를 들어 5x^2 + 6x^3 + 9이있는 경우 첫 번째 단계는 목록 polynomial1의 맨 위에 5 2를 삽입합니다. 다음 반복에서 쌍 (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에 "붙여 넣기"만하면됩니다.
두 번째 경우 다항식 2에서 같은 작업을하십시오.

마지막으로 디스플레이 기능에서 계수가 0 인 항을 더 잘 처리 할 수 ​​있습니다.
아마도 계수가 0 인 항이 표시되지 않는 것이 좋습니다.

프로그램 개선이 훨씬 필요하지만 이는 사용자의 질문 범위를 벗어납니다.

+0

나는'Leeor'의 정렬 방법을 찾고 있습니다 :) –