fgets나 strtok을 쓴다고 하면
지금 구현한 곱셈 함수 외 기타등등을 갈아 엎어야 하더라고요.
그리고 지금 형식으로는 도저히 답이 안나온다고 판단해서, 결국 책에 있는 예제를-_-참고하면서 만들었고요.
결과 다음과 같은 코드를 짜고, 많은 항이 있는 다항식 계산도 됩니다.
#include <stdio.h>
#include <stdlib.h>
typedef struct polynode
{
int coefficient;
int exponent;
struct polynode *next;
}polynode;
polynode *make_node(int coefficient, int exponent)
{
polynode *node;
node=(polynode *)malloc(sizeof(polynode));
if (node)
{
node->coefficient=coefficient;
node->exponent=exponent;
node->next=NULL;
}
return node;
}
void insert_node(polynode *head, polynode *add_node)
{
polynode *now_node=head;
if (head && add_node)
{
while(now_node->next!=NULL)
{
if (now_node->next->exponent < add_node->exponent)
{
add_node->next=now_node->next;
now_node->next=add_node;
}
now_node=now_node->next;
}
if (now_node->next==NULL)
{
add_node->next=now_node->next;
now_node->next=add_node;
}
}
}
int file_input(char *fileName, polynode ***pNode)
{
FILE *input_d;
polynode **head=NULL;
int coefficient;
int exponent;
int flag;
int headnum;
input_d=fopen(fileName, "rt");
if (input_d==NULL)
{
printf("파일을 읽을 수 없습니다!!n");
exit(1);
}
flag=0;
headnum=0;
while(fscanf(input_d,"%d%d",&coefficient,&exponent)!=EOF)
{
if (flag!=1)
{
headnum++;
head=(polynode **)realloc(head, sizeof(polynode *)*headnum);
head[headnum-1]=make_node(0,0);
flag=1;
}
insert_node(head[headnum-1], make_node(coefficient,exponent));
if (exponent==0) flag=0;
}
*pNode=head;
fclose(input_d);
return headnum;
}
void add_PostNode(polynode *head, polynode *add_node)
{
polynode *now_node=head;
polynode *temp;
if (head && add_node)
{
while(now_node->next!=NULL)
{
if (now_node->next->exponent==add_node->exponent)
{
now_node->next->coefficient+=add_node->coefficient;
free(add_node);
if (now_node->next->coefficient==0)
{
temp=now_node->next;
now_node->next=now_node->next->next;
if (temp) free(temp);
}
return;
}else if (now_node->next->exponent < add_node->exponent)
{
add_node->next=now_node->next;
now_node->next=add_node;
}
now_node=now_node->next;
}
if (now_node->next==NULL)
{
add_node->next=now_node->next;
now_node->next=add_node;
}
}
}
void MULTIPLICATION_POLY(polynode *head1, polynode *head2, polynode *sumhead)
{
polynode *node1, *node2;
int coefficient;
int exponent;
if (head1 && head2 && sumhead)
{
for(node1=head1->next; node1!=NULL; node1=node1->next)
{
for(node2=head2->next; node2!=NULL; node2=node2->next)
{
coefficient=node1->coefficient*node2->coefficient;
exponent = (node1->exponent) ? node1->exponent : node2->exponent;
if (node1->exponent!=0 && node2->exponent!=0)
{
exponent = node1->exponent + node2->exponent;
}else{
exponent = (node1->exponent!=0) ? node1->exponent : node2->exponent;
}
add_PostNode(sumhead, make_node(coefficient,exponent));
}
}
}
}
int fileOUTPUT(char *fileName, polynode *head)
{
FILE *out;
polynode *node;
if (head)
{
out=fopen(fileName, "wt");
if (out==NULL)
{
printf("파일이 쓸 수 없음!n");
return 0;
}
for(node=head->next; node!=NULL; node=node->next)
{
fprintf(out,"%d %d ",node->coefficient,node->exponent);
}
fclose(out);
return 1;
}
return 0;
}
void delete_node(polynode *head, polynode *del_node)
{
polynode *now_node;
polynode *temp;
if (head && del_node)
{
now_node=head;
while(now_node->next!=NULL)
{
if (now_node->next->coefficient==del_node->coefficient &&
now_node->next->exponent==del_node->exponent)
{
temp=now_node->next;
now_node->next=now_node->next->next;
if (temp) free(temp);
return;
}
now_node=now_node->next;
}
}
}
void delete_all_node(polynode *head)
{
polynode *now_node;
polynode *temp;
if (head)
{
now_node=head;
while(now_node!=NULL)
{
temp=now_node;
now_node=now_node->next;
if (temp) free(temp);
}
}
}
int main()
{
polynode *node=NULL;
polynode **heads;
polynode *sumhead;
int nHeadnum;
char *finput = "hw1.inp", *foutput = "hw1.out";
nHeadnum=file_input(finput, &heads);
sumhead=make_node(0,0);
MULTIPLICATION_POLY(heads[0], heads[1], sumhead);
fileOUTPUT(foutput, sumhead);
delete_all_node(heads[0]);
delete_all_node(heads[1]);
delete_all_node(sumhead);
if (heads)
{
free(heads);
heads=NULL;
nHeadnum=0;
}
return 0;
}
그런데 문제가 있습니다-_-
집 컴퓨터로는 잘 되는데요.
과제를 서버에 제출하면 (유닉스던가.. 그럴껍니다;) 타임오바가 되버립니다;
컴파일은 되는데 데이터를 받을때 그렇게 되는거 같습니다.
저가 알기로는 서버에서 주는 다항식의 항의 개수가 1000개쯤-_-;; 되는거로 알고요.
20초를 넘어가면 타임오바가 되게 설정을 해놨더라고요..
했긴했는데 타임오바라니 이게 뭡니까-_-;;;; 타임오바가 나지 않게 하려면 뭘 해야할까요;?
이런 경우는 처음이라서 당황스럽네요..
실재로 항을 50개쯤 만들어서 해보니까 뻗어버리네요; 이거 대체 왜이럴까요
적은 다항식은 잘됐는데..