PATA-Exercise No.2

来源:互联网 发布:聪明坏处 知乎 编辑:程序博客网 时间:2024/06/04 20:06

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;}

终于发现问题出在哪了。上一版本是思路不对,现在再采用这个版本的之后,学习到了两点:

  1. 判断结果多项式中非0项有多少个不应在计算的过程中判断,因为计算过程会导致三种情况。非0->0、非0->非0、0->非0。所以不方便判断是否为新增项。

  2. cout.setf(ios::fixed) 和 setprecision(1) 连用可用于设置保留几位小数。

原创粉丝点击