PAT 1009. Product of Polynomials (25)

This time, you are supposed to find A*B where A and B are two polynomials.

Input Specification:

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 Specification:

For each test case you should output the product 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 up to 1 decimal place.

Sample Input
2 1 2.4 0 3.2
2 2 1.5 1 0.5
Sample Output
3 3 3.6 2 6.0 1 1.6

这道题只需要分别存放两个多项式,然后逐项处理就行了。然而我用map来做这道题,第一个点却始终过不去,不知道为什么,也希望有大虾看破了的话能指点我,以下是用map完成的代码:

#include <iostream>
#include <map>
using namespace std;
int main(void)
{
	int i=0,j,k1,k2,k_re,exp,exp_p1,exp_p2,exp_result;
	float coe,coe_p1,coe_p2,coe_result;
	map<int,float> p1;
	map<int,float> p2;
	map<int,float,greater<int> > result;
	cin>>k1;
	while(i<k1)    //input the first polynomial
	{
		cin>>exp>>coe;
		p1[exp]=coe;
		i++;
	}
	i=0;
	cin>>k2;
	while(i<k2)   //input the second plynomial
	{
		cin>>exp>>coe;
		p2[exp]=coe;
		i++;
	}
	map<int,float>::iterator iter_p1;
	map<int,float>::iterator iter_p2;
	k_re=0;
	for(iter_p1=p1.begin();iter_p1!=p1.end();iter_p1++)
	{
		exp_p1=iter_p1->first;
		coe_p1=iter_p1->second;
		for(iter_p2=p2.begin();iter_p2!=p2.end();iter_p2++)
		{
			exp_p2=iter_p2->first;
			coe_p2=iter_p2->second;
			exp_result=exp_p1+exp_p2;
			coe_result=coe_p1*coe_p2;
			if(result.count(exp_result)>0)
				result[exp_result]+=coe_result;
			else
			{
				result[exp_result]=coe_result;
				k_re++;
			}
		}
	}
	map<int,float,greater<int> >::iterator iter_result;	
	cout.setf(ios::fixed);
	cout.precision(1);
	cout<<k_re;
	for(iter_result=result.begin();iter_result!=result.end();iter_result++)
	{
		if(iter_result->second!=0.0)
		{
			cout<<" "<<iter_result->first;
			cout<<" "<<iter_result->second;
		}
	}
	return 0;
}

我自己也在网上寻找其他人的代码,看看是不是哪个点没考虑到,然后看到了下面这个,他使用的是数组来完成这道题。但是我经过尝试并没有发现他的代码与我的代码在结果上有哪里不同,于是非常郁闷。。。以下是用数组实现的代码(能通过PAT所有点):

#include<iostream>  
#include<iomanip>  
#include<string.h>  
using namespace std;  
   
#define max 1000  
double input1[max + 1];  
double input2[max + 1];  
double result[2*max + 1];  
   
int main()  
{  
    memset(input1,0,sizeof(input1));  
    memset(input2,0,sizeof(input2));  
    memset(result,0,sizeof(result));  
    int k;  
    int i,j;  
    int e;  
    //int temp=0; //记录最高指数  
    double c;  
    int count = 0; //最终输出的多项式的项数。  
    cin>>k;  
    for(i=0; i<k; i++)  
    {  
        cin>>e>>c;  
        input1[e] += c;  
    }  
    cin>>k;  
    for(i=0; i<k; i++)  
    {  
        cin>>e>>c;  
        input2[e] += c;  
    }  
   
    for(i=0; i<=1000; i++)  
    {  
        for(j=0; j<=1000; j++)  
        {  
            result[i+j] += input1[i]*input2[j];  
        }  
    }  
    for(i=0; i<=2000; i++) if(result[i] != 0) count++;  
    cout<<count;  
    for(i=2000; i >= 0; i--)  
    {  
        if(result[i] != 0.0) {  
            cout<<" "<<i;  
            cout<<fixed<<setprecision(1);  
            cout<<" "<<result[i];  
        }  
    }  
    cout<<endl;  
    return 0;  
}  



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值