다항식의 PAT A1009 제품 (25 分) (C ++)

이 시간, 당신은 A와 B 두 개의 다항식됩니다 × B를 찾기로되어있다.

입력 사양 :

각 입력 파일은 하나의 테스트 케이스가 포함되어 있습니다. 각각의 경우 2 개 라인을 차지, 각각의 라인은 다항식의 정보가 포함되어 있습니다 :

K가 N N K N 1 1 N 2 N 2 ... N K

여기서 K는 다항식에서 제로가 아닌 항의 수이고, N 및 N I I (I = 1,2, ⋯, K) 지수 및 계수들은 각각. 이것은 주어진 1≤K≤10 것을 0≤N K <⋯ <N 2 <N 1 ≤1000.

출력 사양 :

만약 입력과 같은 형식으로 출력 한 라인의 A 및 B의 생성물을해야 각 테스트 케이스. 이 있어야한다는주의 사항  NO  각 줄의 끝에 여분의 공간. 1 개 소수점 장소에 정확 최대 주시기 바랍니다.

샘플 입력 :

2 1 2.4 0 3.2
2 2 1.5 1 0.5

샘플 출력 :

3 3 3.6 2 6.0 1 1.6

솔루션의 개요 : 우선 맵 <INT 더블> 다항식의 제 1 세트를 수신 NUM 곱한 후 순차적이어서, 승수를 곱한 차례로 요소를 통해 비를 제 2 곱셈 다항식 NUM 수용되는 정의 제로 항목은 ANS에 저장됩니다. (참고로, 다른 점 다항식 A1002 A + B (25 분) (C ++) )

다음과 같이 코드입니다 :

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	scanf("%d",&n);
	map<int,double> num;
	map<int,double> ans;
	for(int i = 0; i < n; i++){
		int exp;
		double coe;
		scanf("%d %lf",&exp,&coe);
		if(coe != 0) num[exp] += coe;   // 输入各个项数 
//		printf("num %d: %d %.1lf\n",i,exp,coe);
	}
	int m;
	scanf("%d",&m);
	for(int i = 0; i < m; i++){
		int exp;
		double coe;
		scanf("%d %lf",&exp,&coe);
		for(map<int,double>::iterator it = num.begin(); it != num.end(); it++){
			int e = it->first;
			double c = it->second;
			ans[e+exp] += c*coe;
			if(ans[e+exp] == 0){
				ans.erase(e+exp);
			}
		}
	}
	if(ans.size() != 0) printf("%d ",ans.size());
	else  printf("%d\n",ans.size());
	for(map<int,double>::iterator it = ans.end(); it != ans.begin();){
		--it;
		if(it != ans.begin()) printf("%d %.1lf ",it->first,it->second);
		else printf("%d %.1lf\n",it->first,it->second);
	}
} 

 

게시 33 개 원래 기사 · 원 찬양 2 · 조회수 1,618

추천

출처blog.csdn.net/qq_38969094/article/details/104320529