翁恺mooc测试:多项式加法

想了好久,在csdn借鉴了其他人排序的方法,最后检测应该是都没什么问题了。

无图无真相,直接上图,考虑了幂次为0、为1以及系数为负数的情况

题目:

多项式加法(5分)

题目内容:

一个多项式可以表达为x的各次幂与系数乘积的和,比如:

2x6+3x5+12x3+6x+20

现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出。

程序要处理的幂最大为100。

输入格式: 总共要输入两个多项式,每个多项式的输入格式如下:

每行输入两个数字,第一个表示幂次,第二个表示该幂次的系数,所有的系数都是整数。第一行一定是最高幂,最后一行一定是0次幂。

注意第一行和最后一行之间不一定按照幂次降低顺序排列;如果某个幂次的系数为0,就不出现在输入数据中了;0次幂的系数为0时还是会出现在输入数据中。

输出格式:从最高幂开始依次降到0幂,如:2x6+3x5+12x3-6x+20

注意其中的x是小写字母x,而且所有的符号之间都没有空格,如果某个幂的系数为0则不需要有那项。

输入样例:

6 2

5 3

3 12

1 6

0 20

6 2

5 3

2 12

1 6

0 20

输出样例:4x6+6x5+12x3+12x2+12x+40

以下是源代码:(欢迎大家指教更简便的算法!

#include <stdio.h>

int max(int a[],int i);

int main ()

{

int a[100],b[100];

int i,cnt=0;

for (i=0;i<100;i++){

a[i]=b[i]=-1;

//printf("%d %d\n", a[i], b[i]);这里是调试了一下,看看有没有把-1存入数组

}

for(i=0;cnt<2;i++){

scanf ("%d %d", &a[i],&b[i]);

if (a[i]==0){

cnt++;//因为0次幂会出现2次,所以在它次数cnt达到2之前的所有数都要读入数组

}

}//读入数据 //printf("%d %d %d\n", a[i], b[i], cnt);

int s=i,change1,change2;//printf("%d", s);

int t=1;//这里做的是:把幂相同的系数相加,将位于后面的系数写为0

for (i=0;i<s;i++){

while (t<s){

if (a[i]==a[t]){

b[i]+=b[t];

b[t]=0;

if (a[i]==0){

a[t]=-1;}//注意a[]==0的情况要单独区分,因为我们每次输出都要根据它们的幂决定,而如果不把后一项的幂a[]定义为负数,则无法与==0的情况区分,导致幂为0的值会输出两次。

//printf("%d", a[t]);

break;

}

t++;

}

t=i+2;

}

int maxid=0;//这里是做一个排序,按照幂次数由高到低排序

while (maxid<s-1){

for (i=s-1;i>maxid;i--){

if (a[i]>a[maxid]){

change1=a[i];

change2=b[i];

a[i]=a[maxid];b[i]=b[maxid];

a[maxid]=change1;b[maxid]=change2;

}

}

maxid++;

}

int c[100][2]={0};//排序后我发现还是无法直接输出答案,因为幂次相同的第二项,只是b[]==0,但是幂次并没有为0。所以我的解决方法是再用第三个数组,二维数组c把所有b[]不为0的数值录入进去,c[][1]就是a[],c[][2]是b[]的值。

for (i=0,t=0;i<s;i++){

if (b[i]!=0){

c[t][1]=a[i];

c[t][2]=b[i];

t++;

}

}

/*for(i=0;i<t;i++){

printf("%d %d\n",c[i][1], c[i][2]);}*/

for (i=0;i<t;i++){

if (c[i][1]==1){

printf("%dx", c[i][2]);

} else if (c[i][1]==0){

printf("%d", c[i][2]);

} else {

printf("%dx%d", c[i][2],c[i][1]);

}

if (i<t-1){

if (c[i+1][2]>=0){

printf("+"); //最后输出的时候,直接带+-不好写,不如重新做一个判断,并且要注意在最后一项之后是不用输出+、-号的,而如果系数是负数,会自带一个-,所以我们只要让正且非最后一个系数后面带一个+即可。

}

}

}

return 0;

}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值