c语言两个多项式求和函数 C语言求多项式

c语言求两个多项式之和算法错误

for(p!=NULL)

10年积累的成都网站建设、成都网站制作经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站制作后付款的网站建设流程,更有蒲城免费网站建设让你可以放心的选择与我们合作。

{

for((q!=NULL)(q-expn=p-expn))

改成

while(p!=NULL)

{

while((q!=NULL)(q-expn=p-expn))

c语言多项式相加

我这有一个实现加减乘除的多项式程序,自己写的,另外输入形式为:-2x^3 +5x^2+3x+4 即可。

其中百度的现实问题,有一个©A和©B的 应该是 COPYA, COPYB

去掉中间空格

支持整数多项式加减乘除。

#includestdio.h

#includestdlib.h

#includectype.h

typedef struct _POLYNODE{

int coef;//系数

int exp;//指数

struct _POLYNODE *next;

}polynode,*polyptr;

void createPoly(polynode **P, char ch[]);//建立多项式链表

void polyAdd(polynode *A,polynode *B);//多项式加

void polyMinus(polynode *A,polynode *B);//减

void polyMulti(polynode *A,polynode *B);//乘

void polyDiv(polynode *A,polynode *B);//除

void order(polynode **P);//排序

void display(polynode *P);//展示多项式

void destroy(polynode **P);//销毁多项式

void menu();//命令菜单

int isPut(char ch[]);

//菜单

void menu(){

printf("1.输入多项式.\n"

"2.多项式相加.\n"

"3.多项式相减.\n"

"4.多项式相乘.\n"

"5.多项式相除.\n"

"6.显示多项式.\n"

"7.销毁多项式.\n"

"8.退出.\n");

}

//判断菜单选择

int IsChoice(int choice){

if(0 choice 9 choice)

return 1;

else

return 0;

}

int isPut(char ch[]){

int i,j = 1;

for(i = 0; ch[i] != '\0'; i++){

{if(0 == j '^' == ch[i])

return 0;

if('^' == ch[i] 1 == j)

j = 0;

if(('+' ==ch[i] || '-' == ch[i] || '*' == ch[i] || '/' == ch[i]) 0 == j)

j = 1;

}

if('.' != ch[i] 'x' != ch[i] 'X' != ch[i] '^' != ch[i] '+' != ch[i] '-' != ch[i] '*' != ch[i] '/' != ch[i] !isdigit(ch[i]))

return 0;

else{

if('+' ==ch[0] || '*' == ch[0] || '/' == ch[0] || '^' == ch[0] || '.' == ch[0])

return 0;

if('\0' == ch[i+1] '+' ==ch[0] || '*' == ch[0] || '/' == ch[0] || '^' == ch[0])

return 0;

// 上面是判断字符串首尾是否合格 下面是中间部分

if(0 != i ch[i+1] != '\0' ){

if(('X' == ch[i] || 'x' == ch[i]) !isdigit(ch[i-1]) '+' != ch[i-1] '-' != ch[i-1] '*' != ch[i-1] '/' != ch[i-1] '.' != ch[i-1])

return 0;

if(('X' == ch[i] || 'x' == ch[i]) '^' != ch[i+1] '+' != ch[i+1] '-' != ch[i+1] '*' != ch[i+1] '/' != ch[i+1])

return 0;

if(('+' == ch[i] || '-' == ch[i] || '*' == ch[i] || '/' == ch[i]) !isdigit(ch[i-1]) 'X' != ch[i-1] 'x' != ch[i-1] !isdigit(ch[i+1]) 'X' != ch[i+1] 'x' != ch[i+1])

return 0;

if('^' == ch[i] 'X' != ch[i-1] 'x' != ch[i-1])

return 0;

if('^' == ch[i] !isdigit(ch[i+1]))

return 0;

if('.' == ch[i] !isdigit(ch[i+1]) !isdigit(ch[i-1]))

return 0;

}

}

}

return 1;

}

void createPoly(polynode **P, char ch[]){

char *t = ch;

int i = 0, j = 1;

int iscoef = 1,isminus = 1;

polyptr Q,L;

if('-' == ch[0]){

isminus = -1;

*t++;

}

while('\0' != *t){

Q = (polyptr)malloc(sizeof(polynode));

Q-coef = 1;

Q-exp = 0;

Q-next = NULL;//申请节点,初始化参数为1.

if(-1 == isminus){

Q-coef *= isminus;

isminus = 1;

}

while('+' != *t '-' != *t '*' != *t '/' != *t '\0' != *t){

if('x' != *t 'X' != *t){

while(isdigit(*t)){

i =((int)*t - 48) + i*10;

t++;

j *= i;

}//抽取数字

if(1 == iscoef 0 != i){

Q-coef *= i;

}

if(0 == iscoef){

Q-exp += i;

iscoef = 1;

}

//如果i=0,则

}

else{

iscoef = 0;

t++;

if('^' == *t)

t++;

else

Q-exp = 1;

}

i = 0;

}//while 遍历到加减乘除,则退出循环,到下一新的节点

iscoef = 1;

if('\0' != *t){

if('-' == *t)

isminus = -1;

t++;

}

if(0 == j){

Q-coef = 0;

j = 1;

}

printf("系数:%d,指数:%d\n",Q-coef,Q-exp);

if(NULL == *P){

*P = Q;

}

else{

L-next = Q;

}

L = Q;

}//while遍历整个字符串

}

void polyAdd(polynode *A,polynode *B){

polyptr P = A, Q,L;

polyptr COPYA = NULL,COPYB = NULL;

if(NULL == A || NULL == B){

printf("多项式未被建立,请先输入多项表达式.\n");

return ;

}

while(NULL != P){//复制A

Q = (polyptr)malloc(sizeof(polynode));

Q-coef = P-coef;

Q-exp = P-exp;

Q-next = NULL;

if(NULL == COPYA)

COPYA = Q;

else

L-next = Q;

L = Q;

P = P-next;

}

P = B;

while(NULL != P){//复制B

Q = (polyptr)malloc(sizeof(polynode));

Q-coef = P-coef;

Q-exp = P-exp;

Q-next = NULL;

if(NULL == COPYB)

COPYB = Q;

else

L-next = Q;

L = Q;

P = P-next;

}

L-next = COPYA;//把COPYA,COPYB两个多项式连接起来,整理一下就OK了.

order(©B);

order(©B);

printf("相加结果为:");

display(COPYB);

destroy(©B);

}

void polyMinus(polynode *A,polynode *B){//相减和相加差不多

polyptr P = A, Q,L;

polyptr COPYA = NULL,COPYB = NULL;

if(NULL == A || NULL == B){

printf("多项式未被建立,请先输入多项表达式.\n");

return ;

}

while(NULL != P){//复制A

Q = (polyptr)malloc(sizeof(polynode));

Q-coef = P-coef;

Q-exp = P-exp;

Q-next = NULL;

if(NULL == COPYA)

COPYA = Q;

else

L-next = Q;

L = Q;

P = P-next;

}

P = B;

while(NULL != P){//复制B

Q = (polyptr)malloc(sizeof(polynode));

Q-coef = -(P-coef);

Q-exp = P-exp;

Q-next = NULL;

if(NULL == COPYB)

COPYB = Q;

else

L-next = Q;

L = Q;

P = P-next;

}

L-next = COPYA;//把COPYA,COPYB两个多项式连接起来,整理一下就OK了.

order(©B);

order(©B);

printf("相减结果为:");

display(COPYB);

destroy(©B);

}

void polyMulti(polynode *A,polynode *B){

polyptr R = A, P = B, Q, L = NULL, T;

if(NULL == A || NULL == B){

printf("多项式未被建立,请先输入多项表达式.\n");

return ;

}

if(0 == A-coef || 0 == B-coef){

printf("多项式乘积为:0\n");

return ;

}

while(NULL != R){

while(NULL != P){

Q = (polyptr)malloc(sizeof(polynode));

Q-coef = P-coef * R-coef;

Q-exp = P-exp + R-exp;

Q-next = NULL;

if(NULL == L)

L = Q;

else

T-next = Q;

T = Q;

P = P-next;

}

P = B;

R = R-next;

}

order(L);

order(L);

printf("多项式乘积为:\n");

display(L);

destroy(L);

}

void polyDiv(polynode *A,polynode *B){//多项式除法

polyptr P = A, Q,L,R,T,C,D;

polyptr COPYA = NULL,COPYB = NULL;

if(NULL == A || NULL == B){

printf("多项式未被建立,请先输入多项表达式.\n");

return ;

}

if(A-coef == 0){

printf("0.\n");

return ;

}

if(B-coef == 0){

printf("除数为0,错误!\n");

return ;

}

if(A-coef B-coef){

printf("商:0,余数为:");

display(A);

return ;

}

while(NULL != P){//复制A

Q = (polyptr)malloc(sizeof(polynode));

Q-coef = P-coef;

Q-exp = P-exp;

Q-next = NULL;

if(NULL == COPYA)

COPYA = Q;

else

L-next = Q;

L = Q;

P = P-next;

}

P = B;

while(NULL != P){//复制B

Q = (polyptr)malloc(sizeof(polynode));

Q-coef = -(P-coef);

Q-exp = P-exp;

Q-next = NULL;

if(NULL == COPYB)

COPYB = Q;

else

L-next = Q;

L = Q;

P = P-next;

}

C = P = Q = L = R = T = NULL;

//------------------开始计算

while(COPYA-exp = COPYB-exp){

D = COPYA;

while(NULL != D-next)

D = D-next;

R = COPYB;

Q = (polyptr)malloc(sizeof(polynode));

Q-coef = (-COPYA-coef) / R-coef;

Q-exp = COPYA-exp - R-exp;

Q-next = NULL;

if(NULL == L)

L = Q;

else

P-next = Q;

P = Q;

while(NULL != R){

Q = (polyptr)malloc(sizeof(polynode));

Q-coef = P-coef * R-coef;

Q-exp = P-exp + R-exp;

Q-next = NULL;

if(NULL == T)

T = Q;

else

C-next = Q;

C = Q;

R = R-next;

}

D-next = T;

order(©A);

order(©A);

T = NULL;

C = NULL;

}

order(L);

order(©A);

printf("A除以B,商:");

display(L);

printf("余数:");

display(COPYA);

destroy(L);

destroy(©A);

destroy(©B);

}

void display(polynode *P){

//考虑情况有系数为1,指数为1,0,一般数;系数为系数不为1,指数为1,0,一般数;

//系数为负数,指数为1,0,一般数,主要考虑中间符号问题.

if(NULL == P){

printf("多项式为空.\n");

return ;

}

if(1 == P-coef){

if(0 == P-exp)

printf("1");

else if(1 == P-exp) printf("x");

else printf("x^%d",P-exp);

}

else{

if(-1 == P-coef){

if(0 == P-exp)

printf("-1");

else if(1 == P-exp) printf("-x");

else printf("-x^%d",P-exp);

}

else if(0 == P-exp)

printf("%d",P-coef);

else if(1 == P-exp) printf("%dx",P-coef);

else

printf("%dx^%d",P-coef,P-exp);

}

P = P-next;

while(NULL != P){

if(0 P-coef){

if(1 == P-coef){

if(0 == P-exp)

printf("+1");

else if(1 == P-exp) printf("+x");

else printf("+x^%d",P-exp);

}

else{

if(0 == P-exp)

printf("+%d",P-coef);

else if(1 == P-exp) printf("+%dx",P-coef);

else

printf("+%dx^%d",P-coef,P-exp);

}

}

else{

if(-1 == P-coef){

if(0 == P-exp)

printf("-1");

else if(1 == P-exp) printf("-x");

else printf("-x^%d",P-exp);

}

else{

if(0 == P-exp)

printf("%d",P-coef);

else if(1 == P-exp) printf("%dx",P-coef);

else

printf("%dx^%d",P-coef,P-exp);

}

}

P = P-next;

}

printf("\n");

}

void destroy(polynode **P){

polyptr Q = *P;

if(NULL == *P)

return ;

while(*P != NULL){

Q = *P;

*P = (*P)-next;

delete Q;

}

}

void order(polynode **P){

//首先 系数为零的要清掉,其次指数从高到低排序,再者系数相同的要合并.

polyptr prev,curr,OUT,INcurr;//前一节点和当前节点

int temp;

//出去第一节点系数为0的项

while(NULL != *P){

if(0 != (*P)-coef)

break;

else{

if(NULL == (*P)-next)

return;

curr = *P;

(*P) = (*P)-next;

delete curr;

}

}

if(NULL == *P || NULL == (*P)-next)//如果只剩1项或空,则不需要整理,退出函数

return;

//冒泡排序

OUT = INcurr = *P;

while(NULL != OUT-next){//外循环

while(NULL != INcurr-next){//内循环

prev = INcurr;

INcurr = INcurr-next;

if(prev-exp INcurr-exp){

temp = prev-coef;

prev-coef = INcurr-coef;

INcurr-coef = temp;//交换系数

temp = prev-exp;

prev-exp = INcurr-exp;

INcurr-exp = temp;//交换指数

}

}

OUT = OUT-next;

INcurr = *P;

}

//去除0项

prev = curr = *P;

curr = curr-next;

while(NULL != curr){

if(0 == curr-coef){

prev-next = curr-next;

delete curr;

curr = prev-next;

}

else{

prev = curr;

curr = curr-next;

}

}

//合并同类项

OUT = INcurr = *P;

while(NULL != OUT-next){

while(NULL != INcurr-next){

prev = INcurr;

INcurr = INcurr-next;

if(INcurr-exp == OUT-exp){

OUT-coef += INcurr-coef;

prev-next = INcurr-next;

delete INcurr;

INcurr = prev;

}

}

INcurr = OUT = OUT-next;

if(NULL == OUT)

return;

}

}

void main(){

int choice;

// int i;

char ch[100];

polynode *polyA,*polyB;

polyA = polyB = NULL;

menu();

scanf("%d",choice);

while(!IsChoice(choice)){

menu();

printf("输入错误,重新输入.\n");

scanf("%d",choice);

}

while(8 != choice){

switch(choice){

case 1:

if(NULL != polyA || NULL != polyB){

destroy(polyA);

destroy(polyB);

printf("原多项式被销毁.\n");

}

printf("多项式输入格式:4x^3+7x^2+x+6--x不分大小写.\n输入多项式A:\n");

scanf("%s",ch);

while(!isPut(ch)){

printf("输入错误!重新输.\n");

scanf("%s",ch);

}

createPoly(polyA,ch);//建立多项式A链表

printf("输入多项式B:\n");

scanf("%s",ch);

while(!isPut(ch)){

printf("输入错误!重新输.\n");

scanf("%s",ch);

}

createPoly(polyB,ch);//建立多项式B链表

order(polyB);

order(polyA);//整理排序多项式,默认降幂

printf("建立多项式成功!多项式:\nA为:");

display(polyA);

printf("B为:");

display(polyB);

break;

case 2:

polyAdd(polyA,polyB);

break;

case 3:

polyMinus(polyA,polyB);

break;

case 4:

polyMulti(polyA,polyB);

break;

case 5:

printf("PS:系数只支持整数,计算除法存在误差;\n如果除数所有项系数为1,能得到正确答案,或者某些情况系数刚好被整除.");

polyDiv(polyA,polyB);

break;

case 6:

printf("------显示多项式------\nA :");

display(polyA);

printf("B :");

display(polyB);

break;

case 7:

destroy(polyA);

destroy(polyB);

printf("此多项式已被清空.\n");

break;

default:

return ;

}

choice = 0;

menu();

scanf("%d",choice);

while(!IsChoice(choice) || 0 == choice){

menu();

printf("输入错误,重新输入.\n");

scanf("%d",choice);

}

}

}

多项式求和的c语言程序

#include stdio.h

int Fluction(int);//声明实现多项式 1-1/2+1/3-1/4+1/5-1/6+...的功能函数

double sum;//定义全局变量(其实一般不推荐定义全局变量)

int main()

{

int m,n;//m个测试实例,求前 n项和

while(scanf("%d",m)!=EOF)

{

for(int i=1;i=m;i++)//输入 m个测试实例,所以循环 m次

{

scanf("%d",n);

Fluction(n);//调用函数,传参 n

printf("%.2lf\n",sum);//保留两位小数输出

}

}

}

int Fluction(int t)//函数定义,实现 1-1/2+1/3-1/4+1/5-1/6+...多项式

{

int sign=1;//定义符号

double x;

sum=0;

for(int i=1;i=t;i++)//要求前几项的和就循环几次

{

x=(double)sign/i;//强制转变类型

sum+=x;

sign*=-1;

}

return sum;//一定要定义它返回 sum的值,否则,函数会自动返回 0

}

两个多项式相加运算(用c语言)

#includestdio.h

#includemalloc.h

#define Null 0

typedef struct Node

{

int coeff;

int expo;

Node *next;

}listNode,*list;

list createList()

{

list head;

head = (list)malloc(sizeof(listNode));

head = NULL;

printf("want to create a new node?y/n\n");

char ch;

fflush(stdin);

scanf("%c",ch);

while(ch=='Y' || ch== 'y')

{

list p;

p = (list)malloc(sizeof(listNode));

printf("input coeff\n");

int coeff;

scanf("%d",coeff);

p-coeff = coeff;

printf("input expo\n");

int expo;

scanf("%d",expo);

p-expo = expo;

p-next = NULL;

//链表为空的时候,即添加首个元素

if(head == NULL)

{

head=p;//添加代码

}

else

{

list prev,curr;

curr = head;

prev = NULL;

//找到添加位置

while(curr!=NULL curr-expop-expo)

{

prev=curr;

curr=curr-next;//添加代码

}

if(curr!=NULL curr-expo == p-expo)

{

curr-coeff = curr-coeff + p-coeff;

printf("want to create a new node?y/n\n");

fflush(stdin);

scanf("%c",ch);

if(ch=='Y' || ch== 'y')

continue;

else

return head;

}

//插入结点,结点非首

if(prev != NULL)

{

p-next=curr;

prev-next=p;

//添加代码

}

//插入结点,结点为首

else

{

p-next=curr;

head=p;

//添加代码

}

}

printf("want to create a new node?y/n\n");

fflush(stdin);

scanf("%c",ch);

}

return head;

}

list add(list head1,list head2)

{

list head,newNode,ptr1,ptr2,ptr3;

ptr1 = head1;

ptr2 = head2;

head = NULL;

while(ptr1 != NULL ptr2 != NULL)

{

newNode = (list)malloc(sizeof(listNode));

if(ptr1-expo ptr2-expo)

{

newNode-coeff = ptr1-coeff;

newNode-expo = ptr1-expo;

newNode-next = NULL;

ptr1 = ptr1-next;

}

else if(ptr1-expo ptr2-expo)

{

newNode-coeff = ptr2-coeff;

newNode-expo = ptr2-expo;

newNode-next = NULL;

ptr2 = ptr2-next;//添加代码

}

else

{

newNode-coeff = ptr1-coeff + ptr2-coeff;

newNode-expo = ptr1-expo;

newNode-next = NULL;

ptr1 = ptr1-next;

ptr2 = ptr2-next;

}

if(head==NULL)

{

head = newNode;

}

else

{

ptr3 = head;

//添加代码

while(ptr3-next != NULL)

ptr3 = ptr3-next;

ptr3-next = newNode;

}

}

while(ptr1 != NULL)

{

newNode = (list)malloc(sizeof(listNode));

newNode-coeff = ptr1-coeff;

newNode-expo = ptr1-expo;

newNode-next = NULL;

ptr3 = head;

if(ptr3 == NULL)

head = ptr3 = newNode;

else

{

while(ptr3-next != NULL)

ptr3 = ptr3-next;

ptr3-next = newNode;//添加代码

}

ptr1 = ptr1-next;

}

while(ptr2 != NULL)

{

newNode = (list)malloc(sizeof(listNode));

newNode-coeff = ptr2-coeff;

newNode-expo = ptr2-expo;

ptr3 = head;

if(ptr3 == NULL)

head = ptr3 = newNode;

else

{

while(ptr3-next != NULL)

ptr3 = ptr3-next;

ptr3-next = newNode;

}

ptr2 = ptr2-next;

}

return head;

}

void display(list head)

{

list ptr = head;

while(ptr != NULL)

{

if(ptr != head )

printf("+");

printf("%d",ptr-coeff);

printf("x^");

printf("%d",ptr-expo);

ptr = ptr-next;

}

printf("\n");

}

int main(int argc, char* argv[])

{

list head,head1,head2;

printf("input the first list\n");

head1 = createList();

display(head1);

printf("input the second list\n");

head2 = createList();

display(head2);

head = add(head1,head2);

display(head);

return 0;

}


网站栏目:c语言两个多项式求和函数 C语言求多项式
文章路径:http://hbruida.cn/article/docicod.html