c语言,多项式加法,含注释

题目要求:

一个多项式可以表达为 x 的各次幂与系数乘积的和,比如:2x6+3x5+12x3+6x+20
现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出。
程序要处理的幂最大为 100。

题目内容

一个多项式可以表达为 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

#include<stdio.h>
#include<math.h>
int main()
{
	const int N = 100;
	int arr[N];//自定义一个数组,并且规定他的容量是100,符合题意100幂
	for (int i = 0; i < N; i++) {
		arr[i] = 0;
	}//	遍历数组,全部初始化为0
	int n, a, count = 0;//n是次方,a是系数,ax^n
	while (count < 2){
		scanf_s("%d %d", &n, &a);
		if (n == 0) {
			count++;
		}
		if (arr[n] == 0) {
			arr[n] = a;
		}
		else {
			arr[n] += a;
		}
	}//12~24的意思是录入n和a,如果是0次方,则计数加一,若是非零次方,则根据数组
	//的“n”上是否为0来录入a
	int best = 0;//最高次幂选出27~32
	for (int i = N-1; i > 0; i--) {
		if (arr[i] != 0) {
			best = i;
			break;
		}
	}
	//下面分割为全部次幂为0和有次幂不为零;
	//次幂不为零又分为n>1,n=1,n=0;
	//为看起来更加容易理解,使用abs利用绝对值分类,再最后赋上正负号;
	if (best==0) {
		printf("%d", arr[0]);
	}else {
		for (int i = best; i > -1; i--) {
			if (i > 1) {    //这时候就确定了结果一定有x%d,分为系数绝对值为1和非1
				if (abs(arr[i]) == 1) {
					printf("x%d", i);
				}else if(abs(arr[i]) > 1) {
					printf("%dx%d", abs(arr[i]), i);
				}
			}else if (i == 1) {  //分为x和%dx,以下同理
				if (abs(arr[i]) == 1) {
					printf("x");
				}
				else {
					printf("%dx", abs(arr[i]));
				}
			}
			else if (i == 0) {
				if (abs(arr[i]) != 1) {
					printf("%d", abs(arr[i]));
				}
			}
			if (i > 0) {
				if (arr[i - 1] > 0) {
					printf("+");
				}
				else if (arr[i - 1] < 0) {
					printf("-");
				}
			}
		}
	}
	return 0;
}

试过多种边界值,

①0 20

0 20,输出40

②0 -20

0 -20,输出-40;

③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

但是有一定问题,比方我认为这不符合单一出口原则,有过多的printf函数,这会导致修改方面很费精力,我很想改良成单一出口的模式,但是我现在还没有思路,如果后续有了新的想法会回来进行修改,如果有人有新的想法可以在评论区提出。


版权声明:本文为liliour原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。