This time, you are supposed to find A+B where A and B are two polynomials.
Input
Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial: K N1 aN1 N2 aN2 ... NK aNK, where K is the number of nonzero terms in the polynomial, Ni and aNi (i=1, 2, ..., K) are the exponents and coefficients, respectively. It is given that 1 <= K <= 10,0 <= NK < ... < N2 < N1 <=1000.
Output
For each test case you should output the sum of A and B in one line, with the same format as the input. Notice that there must be NO extra space at the end of each line. Please be accurate to 1 decimal place.
Sample Input
2 1 2.4 0 3.2
2 2 1.5 1 0.5
Sample Output
Input
Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial: K N1 aN1 N2 aN2 ... NK aNK, where K is the number of nonzero terms in the polynomial, Ni and aNi (i=1, 2, ..., K) are the exponents and coefficients, respectively. It is given that 1 <= K <= 10,0 <= NK < ... < N2 < N1 <=1000.
Output
For each test case you should output the sum of A and B in one line, with the same format as the input. Notice that there must be NO extra space at the end of each line. Please be accurate to 1 decimal place.
Sample Input
2 1 2.4 0 3.2
2 2 1.5 1 0.5
Sample Output
3 2 1.5 1 2.9 0 3.2
一开始用两个数组,然后傻傻地相加做,然后只有前三个测试点ac,百思不得其解,然后换一个思路,反正数据量不大,只有1000个,那我就只开一个1000的浮点型数组,下标作为指数,数组元素作为系数,一边输入一边相加。
两个数组没有全ac的1.0版本
#include <stdio.h>
#include <stdlib.h>
int main()
{
int aTNum, bTNum, cTNum;
int i, j, w;
scanf("%d", &aTNum);
float a[aTNum][2];
for(i=0, j=aTNum; i<j; i++)
{
scanf("%f %f", &a[i][0], &a[i][1]);
if(a[i][0] == a[i-1][0])
{
a[i-1][1] += a[i][1];
i = i-1;
j--;
}
}
aTNum = j;
scanf("%d", &bTNum);
float b[bTNum][2];
for(i=0, j=bTNum; i<j; i++)
{
scanf("%f %f", &b[i][0], &b[i][1]);
if(b[i][0] == b[i-1][0])
{
b[i-1][1] += b[i][1];
i = i-1;
j--;
}
}
bTNum = j;
cTNum = aTNum+bTNum;
float c[cTNum][2];
for(i=0, j=0, w=0; i<aTNum && j<bTNum; )
{
if(a[i][0] > b[j][0])
{
c[w][0] = a[i][0];
c[w][1] = a[i][1];
w++;
i++;
}
else if(a[i][0] < b[j][0])
{
c[w][0] = b[j][0];
c[w][1] = b[j][1];
w++;
j++;
}
else
{
c[w][0] = a[i][0];
c[w][1] = a[i][1] + b[j][1];
w++;
i++;
j++;
}
}
//printf("%f %f \n", b[i][0], b[i][1]);
//printf("\n");
while(i<aTNum)
{
c[w][0] = a[i][0];
c[w][1] = a[i][1];
w++;
i++;
}
while(j<bTNum)
{
c[w][0] = b[j][0];
c[w][1] = b[j][1];
w++;
j++;
}
printf("%d", w);
for(i=0; i<w; i++)
{
printf(" %.0f %.1f", c[i][0], c[i][1]);
}
return 0;
}全ac版本
#include <stdio.h>
#include <stdlib.h>
int main()
{
float a[1001] = {0};
int num, expt, counter;
float coef;
int i;
scanf("%d", &num);
for(i=0; i<num; i++)
{
scanf("%d %f", &expt, &coef);
a[expt] += coef;
}
scanf("%d", &num);
for(i=0; i<num; i++)
{
scanf("%d %f", &expt, &coef);
a[expt] += coef;
}
for(i=1000, counter=0; i>=0; i--)
{
if(a[i]!=0)
counter++;
}
printf("%d", counter);
for(i=1000; i>=0; i--)
{
if(a[i]!=0)
printf(" %d %0.1f", i, a[i]);
}
return 0;
}
本文介绍了一种解决多项式加法问题的算法实现方法,通过使用数组存储多项式的系数和指数来简化计算过程,并提供了两种不同的实现方案,一种采用二维数组存储,另一种则优化为一维数组。
1418

被折叠的 条评论
为什么被折叠?



