题目要求:
一个多项式可以表达为 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 25 33 121 60 206 25 32 121 60 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 25 33 121 60 206 25 32 121 60 20输出4x6+6x5+12x3+12x2+12x+40
但是有一定问题,比方我认为这不符合单一出口原则,有过多的printf函数,这会导致修改方面很费精力,我很想改良成单一出口的模式,但是我现在还没有思路,如果后续有了新的想法会回来进行修改,如果有人有新的想法可以在评论区提出。