原题
思想
这题踩了输出格式的坑,精度得保留小数点后一位。
设置小数位数法:
cout<<setiosflags(ios::fixed)<<setprecision(1);
当setiosflags(ios::fixed)和serprecision(n)两个一起用时就表du示保留n位小数输出。这里还要注意,每次输出只要设置一次就行了,因为这两个的作用范围是后续对象,而不是仅对后一个对象起作用。
这里我用了2种方法。
- 方法一采用i,j指针分别控制A和B,判断系数相等和不相等的情况
- 方法二采用数组直接记录,下标表示指数,数组存的值表示系数,输入A和B都在一个a[ ]中完成运算
代码
方法一
/** 1002 A+B for Polynomials (25分)
*
* exponents 指数 coefficients 系数
* */
#include<iostream>
#include <iomanip>
using namespace std;
struct
{
int k;
int exp[1000];
double coe[1000];
}poly[3];
int main()
{
for(int i=0;i<2;i++)
{
cin>>poly[i].k;
for (int j = 0; j < poly[i].k; j++)
{
cin>>poly[i].exp[j];
cin>>poly[i].coe[j];
}
}
int i=0,j=0,k=0;
while (i<poly[0].k && j<poly[1].k)
{
// 当A的第i位指数和B的第j位指数相同,系数相加
if(poly[0].exp[i]==poly[1].exp[j])
{
if(poly[0].coe[i]+poly[1].coe[j]==0)
{
i++,j++;
continue;
}
poly[2].exp[k]=poly[0].exp[i];
poly[2].coe[k]=poly[0].coe[i]+poly[1].coe[j];
i++,j++;
}
// A的第i位比B 第j位大
else if(poly[0].exp[i]>poly[1].exp[j])
{
poly[2].exp[k]=poly[0].exp[i];
poly[2].coe[k]=poly[0].coe[i];
i++;
}
else
{
poly[2].exp[k]=poly[1].exp[j];
poly[2].coe[k]=poly[1].coe[j];
j++;
}
k++;
}
for(;i<poly[0].k;i++)
{
poly[2].exp[k]=poly[0].exp[i];
poly[2].coe[k]=poly[0].coe[i];
k++;
}
for(;j<poly[1].k;j++)
{
poly[2].exp[k]=poly[1].exp[j];
poly[2].coe[k]=poly[1].coe[j];
k++;
}
cout<<k;
for (int i = 0; i < k; i++)
{
cout<<" "<<poly[2].exp[i]<<setiosflags(ios::fixed)<<setprecision(1)<<" "<<poly[2].coe[i];
}
return 0;
}
方法二
/** 1002 A+B for Polynomials (25分)
*
* exponents 指数 coefficients 系数
* */
#include<iostream>
#include <iomanip>
using namespace std;
double a[1000];
int main()
{
int n,j,imax=0,sum=0;
double t;
cin>>n;
for (int i = 0; i < n; i++)
{
cin>>j;
cin>>a[j];
imax=max(imax,j);
}
cin>>n;
for (int i = 0; i < n; i++)
{
cin>>j;
cin>>t;
a[j]+=t;
if(a[j]!=0)
imax=max(imax,j);
}
for (int i = 0; i <=imax; i++)
{
if(a[i]!=0)sum++;
}
cout<<sum;
for (int i = imax; i >= 0; i--)
{
if(a[i]!=0)
cout<<" "<<i<<setiosflags(ios::fixed)<<setprecision(1)<<" "<<a[i];
}
return 0;
}