问题描述
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。
输入样例:
2 2 2 1 1
1 1 1
输出:
2 3 1 2
2 2 2 1
思路
通过A,B数组储存乘法和加法运算的结果。将系数作为数组存储的内容,指数用下标表示。
加法(系数相加):
表达式1:在B数组中以指数作为下标,将相应的位置。
式子2:用循环输入,同表达式1。
最后得到的和即为结果
乘法(系数相乘):
式子1的每一项乘以对式子2,将式子2输入的每一项指数分别和式子1的指数相加作为A数组下标,相应的系数储存在数组中。
最后倒序输出下标和相应下标内容得出解
代码
#include<stdio.h>
struct Poly {
int ex;
int co;
}Poly[1001];
int main() {
int a, b, A[2005] = { 0 }, B[1005] = { 0 };
scanf_s("%d", &a);
int temp1, temp2;
for (int i = 0; i < a; i++) {
scanf_s("%d%d", &Poly[i].co, &Poly[i].ex);//先输入系数,后输入指数
B[Poly[i].ex] += Poly[i].co; //指数作为下标,系数作为数组元素
}
scanf_s("%d", &b);
for (int i = 0; i < b; i++) {
scanf_s("%d%d", &temp1, &temp2);
B[temp2] += temp1;
for (int j = 0; j < a; j++)
A[temp2 + Poly[j].ex] += (temp1 * Poly[j].co);//指数相加,系数相乘
}
int isfirst = 1, haveoutput = 0;//isfirst判断是否是第一个输出,haveoutput判断最后是否是零多项式
for (int i = 2000; i >= 0; i--) {
if (A[i] != 0) {
if (!isfirst) printf(" %d %d", A[i], i);
if (isfirst) {
isfirst = 0;
printf("%d %d", A[i], i);
}
haveoutput = 1; //如果执行了if语句则不是零多项式
}
}
if (!haveoutput) printf("0 0");
haveoutput = 0; //重置判断第二次输出是否是零多项式
isfirst = 1; //重置判断第二次输出的第一项
putchar('\n');
for (int i = 1000; i >= 0; i--) {
if (B[i] != 0) {
if (!isfirst) printf(" %d %d", B[i], i);
if (isfirst) {
printf("%d %d", B[i], i);
isfirst = 0;
}
haveoutput = 1;
}
}
if (!haveoutput) printf("0 0");
return 0;
}
参考
https://blog.csdn.net/wanmeiwushang/article/details/52625834