题目
设计函数分别求两个一元多项式的乘积与和。
思路
数学公式基本思路了,运用循环该怎么算怎么算了。
代码
#include<stdio.h>
#include<stdlib.h>
#define N 1000
typedef struct pramary{
int data;
int exp;
}element;
void Add(element group1[N],element group2[N]);
void Multiple(element g1[N],element g2[N]);
element a[N],b[N];
element add[2*N],mul[2*N];
int n,m,index=0;
void main(){
int i;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i].data);
scanf("%d",&a[i].exp);
}
scanf("%d",&m);
for(i=0;i<m;i++){
scanf("%d",&b[i].data);
scanf("%d",&b[i].exp);
}
if(!n||!m){
printf("0 0");
}else
Multiple(a,b);
printf("\n");
if(!n&&!m)
printf("0 0");
else
Add(a,b);
system("pause");
}
void Multiple(element g1[N],element g2[N]){
int i,j,flag,k;
element temp,multiple[2*N];
for(i=0;i<n;i++)
for(j=0;j<m;j++){
mul[index].data=g1[i].data*g2[j].data;
mul[index].exp=g1[i].exp+g2[j].exp;
index++;
}
//for(i=0;i<index;i++)
//printf("%d %d ",mul[i].data,mul[i].exp);
//sort
for(i=1;i<index;i++){
flag=1;
for(j=0;j<index-i;j++){
if(mul[j].exp<mul[j+1].exp){
temp=mul[j];
mul[j]=mul[j+1];
mul[j+1]=temp;
flag=0;
}
}
if(flag)
break;
}
//去重
multiple[0]=mul[0];
k=0;
for(i=1;i<index;i++){
if(multiple[k].exp==mul[i].exp){
multiple[k].data+=mul[i].data;
}else{
multiple[++k]=mul[i];
}
}
//输出
for(i=0;i<=k;i++){
printf("%d %d ",multiple[i].data,multiple[i].exp);
}
}
void Add(element group1[N],element group2[N]){
int i,j,k;
for(i=0,j=0,k=0;i<n&&j<m;k++){
if(group1[i].exp>group2[j].exp){
add[k]=group1[i++];
}else if(group1[i].exp<group2[j].exp){
add[k]=group2[j++];
}else{
add[k].data=group1[i].data+group2[j].data;
add[k].exp=group1[i].exp;
i++;
j++;
}
}
while(i<n){
add[k++]=group1[i++];
}
while(j<m){
add[k++]=group2[j++];
}
for(i=0;i<k;i++){
printf("%d %d ",add[i].data,add[i].exp);
}
}
总结
定义数组一开始不宜定义过大,内存容易溢出,一开始设计mul[N*N],直接设计为1000,000。直接溢出了无法运行,一开始还以为程序代码出问题了呢。