PATA-Exercise No.2

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) 连用可用于设置保留几位小数。

猜你喜欢

转载自blog.csdn.net/without_mercy/article/details/73656756