PAT甲级练习02
题目:PAT1002
普通思路版:
20170623于华东交通大学
#include<iostream>
#include<iomanip>
int main() {
int a = 0;//第一个多项式的项数
int b = 0;//第二个多项式的项数
std::cin >> a;
double* a_1 = new double[a];//存储第一个多项式的指数
double* a_2 = new double[a];//存储第一个多项式的系数
for (size_t i = 0; i < a; i++)
{
std::cin >> a_1[i] >> a_2[i];
}
std::cin >> b;
double* b_1 = new double[b];//存储第二个多项式的指数
double* b_2 = new double[b];//存储第二个多项式的系数
for (size_t i = 0; i < b; i++)
{
std::cin >> b_1[i] >> b_2[i];
}
//for (size_t i = 0; i < a; i++)
//{
// std::cout << a_1[i] << std::endl;;
//}
//for (size_t i = 0; i < b; i++)
//{
// std::cout << b_1[i] << std::endl;
//}
double** sum=new double*[a+b] ;//二维数组存储结果
for (size_t i = 0; i < a+b; i++)
{
sum[i] = new double[2];
}
size_t sum_k = 0;//结果多项式中有多少项
size_t a_i = 0;//当前a多项式中已处理到第几项
size_t b_i= 0;//当前b多项式中已处理到第几项
bool a_finish = false;//标识a是否被扫描完成
bool b_finish = false;//标识b是否被扫描完成
do
{
bool a_deal = false;//标志a中当前项是否被处理
bool b_deal = false;//标志b中当前项是否被处理
if (a_finish) {
sum[sum_k][0] = b_1[b_i];
sum[sum_k][1] = b_2[b_i];
sum_k++;
b_deal = true;
}
else if (b_finish)
{
sum[sum_k][0] = a_1[a_i];
sum[sum_k][1] = a_2[a_i];
sum_k++;
a_deal = true;
}
else
{
if (a_1[a_i]>b_1[b_i])
{
sum[sum_k][0] = a_1[a_i];
sum[sum_k][1] = a_2[a_i];
sum_k++;
a_deal = true;
}
else if (a_1[a_i] == b_1[b_i])
{
sum[sum_k][0] = a_1[a_i];
sum[sum_k][1] = a_2[a_i] + b_2[b_i];
sum_k++;
a_deal = true;
b_deal = true;
}
else
{
sum[sum_k][0] = b_1[b_i];
sum[sum_k][1] = b_2[b_i];
sum_k++;
b_deal = true;
}
}
//处理了就换下一个
if (a_deal)
{
a_i++;
if (a_i==a)
{
a_finish = true;
}
}
if (b_deal)
{
b_i++;
if (b_i==b)
{
b_finish = true;
}
}
} while ((!a_finish)||(!b_finish));
std::cout << sum_k << " ";
for (size_t ii = 0; ii < sum_k; ii++)
{
std::cout << std::setiosflags(std::ios::fixed)
<< std::setprecision(0) << sum[ii][0] << " " << std::setiosflags(std::ios::fixed)
<< std::setprecision(1) << sum[ii][1] ;
if (ii!=(sum_k -1))
{
std::cout << " ";
}
}
/*system("pause");*/
return 0;
}
满分通过版:
20170816于华东交通大学
#include <iostream>
#include<iomanip>
#include <cstdio>
using namespace std;
int main() {
float c[1001] = { 0 };
int m, n, t;
/*int nonzero_item_num = 0;*/
float num;
cin >> m;
//nonzero_item_num = m;
for (int i = 0; i < m; i++) {
cin >> t >> num;
c[t] += num;
}
cin >> n;
for (int i = 0; i < n; i++) {
cin >> t >> num;
/*if (c[t]==0.0)
{
++nonzero_item_num;
}*/
c[t] += num;
}
/*int cnt = nonzero_item_num;*/
int cnt = 0;
for (int i = 0; i < 1001; i++) {
if (c[i] != 0) cnt++;
}
cout << cnt;
if (cnt != 0) {
for (int i = 1000; i >= 0; i--) {
if (c[i] != 0.0 && cnt > 0) {
/*printf("%d %.1f", i, c[i]);*/
cout.setf(ios::fixed);
cout <<" "<< i << " " << setprecision(1) << c[i];
cnt--;
}
}
}
return 0;
}
终于发现问题出在哪了。上一版本是思路不对,现在再采用这个版本的之后,学习到了两点:
判断结果多项式中非0项有多少个不应在计算的过程中判断,因为计算过程会导致三种情况。非0->0、非0->非0、0->非0。所以不方便判断是否为新增项。
cout.setf(ios::fixed) 和 setprecision(1) 连用可用于设置保留几位小数。