# 中国的大学MOOC 程序设计入门 翁恺 第七周作业一
题目内容:
一个多项式可以表达为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
时间限制:500ms内存限制:32000kb
代码如下:
此代码仅使用一维数组判定,不需二维,也不需要定义结构。适合按照温恺老师mooc一章一章来的同学使用,当然我们也能使用链表来计算,不过这里感觉没啥区别,数组即可实现。
#include <stdio.h>
/*该问题要读入两个多项式,且x的幂次从0到100,那么在c语言中很容易联想到数组也是从0开始计数,
那么便可以创造一个101个容量的数组,在对应幂次
的地方存放该幂次的系数,这样便可以将两个多项式存储起来,
对于输出环节面临的问题有这样几个,1,当幂次大于1,幂次等于1,
幂次等于0时输出的形式是不一样的,
2:当系数等于0,等于1,时输出的形式也不一样 3:需要判断该输出项是否为第一项,因为第一项为正时不需要输出“+”。
有些繁琐,但是读完代码会发现,每一块的判别都是一样的。
*/
int main(int argc, const char * argv[]) {
// insert code here...
int e = 0;
int number[101];
int number2[101];
int i;
//使两个数组都初始化为0
for (i=0;i<101;i++){
number[i]=0;
}
for (i=0;i<101;i++){
number2[i]=0;
}
//读入两个多项式,分别保存到number,number2数组
int a,b;
do {scanf("%d %d",&a,&b);
number[a]=b;
}while(a!=0);
int c,d;
do {scanf("%d %d",&c,&d);
number2[c]=d;
}while(c!=0);
//输出
int count=1;//计数子,因为输出的第一项如果是正数则不用加“+”,故而用来判断是否是输出的第一项,从而决定要不要加符号。
for (i=100;i>=0;i--){
e = number[i]+number2[i];//相同幂次项求和
if(i>1){
if(e==0){
}else{
if(e == 1){
if(count==1){
printf("x%d",i);
}else{
printf("+x%d",i);
count++;
}
}else{
if(e>1){
if(count==1){
printf("%dx%d",e,i);
count++;
}else{
printf("+");
printf("%dx%d",e,i);
count++;
}
}else{
printf("%dx%d",e,i);
count++;
}
}
}
}else{
if(i==1){
if(e==0){
}else{
if(e == 1){
if(count==1){
printf("x");
}else{
printf("+x");
count++;
}
}else{
if(e>1){
if(count==1){
printf("%dx",e);
count++;
}else{
printf("+");
printf("%dx",e);
count++;
}
}else{
printf("%dx",e);
count++;
}
}
}
}
if(i==0){
if(e==0){
if(count==1){
printf("0");
}
}else{
if(e>0){
if(count==1){
printf("%d",e);
}else{
printf("+%d",e);
}
}else{
printf("%d",e);
}
}
}
}
}
return 0;
}