<编程小白的PAT试题笔记>A1002 A+B for Polynomials (25 分)
本次编程训练以20分钟为一个单位划分,第一个15分钟思考了解题思路,需要用到什么结构工具,第二个15分钟进行了编程及测试,在编写结束后调试时发现了很多问题,参考了 《算法笔记》之后对代码分别进行了修改和重新编写。本文涉及题目思路部分(思路和边界清情况),代码部分,遇到的问题,对题目的总结。
PS.真的是纯小白一个,数据结构还没有学完…c++用的也没有很熟练,代码写的还有些麻烦,不好看甚至说很蠢…有问题还请各位大佬批评指正(认真的鞠躬)。
思路部分
解题思路
解题思路1(有错误的思路)
此版本为最开始的思路。
- 连续读入变量n1,n2
- 读入后边的多项式系数等
- i =0,j=0;
- 新建结构体,成员为一个int类型和double类型
- 为读入第一行第二行新建结构体数组,大小为11
- 创建结果数组,大小为22
- 循环:
if(jn2||num1[i].ID>num2[j].ID)
if(jn1||num1[i].ID<num2[j].ID)
if(num1[i].ID==num2[j].ID)
在这三种情况下依次判断进行计算,用一个变量cnt作为计数器,在循环中递增 - 输出cnt的值以及结构体数组的值
解题思路2(改进思路1)
参考了《算法笔记》之后,发现结果应不输出0项,所以加以改进。但是输出部分还有问题。暂时没想出来怎么改,以后再说吧…
代码部分
#include <cstdio>
struct number{
int ID;
double value;
}num1[11],num2[11],result[22];
int main()
{
// int i=0,j=0,cnt=0;
int n1,n2;
scanf("%d",&n1);//
for(int i=0;i<n1;i++){
scanf("%d%lf",&num1[i].ID,&num1[i].value);
}
scanf("%d",&n2);
for(int i=0;i<n2;i++){
scanf("%d%lf",&num2[i].ID,&num2[i].value);
}
int i,j,cnt=0;
for(i=0,j=0;(i<n1)||(j<n2);){//
if(j==n2||num1[i].ID>num2[j].ID){
result[cnt].ID = num1[i].ID;
result[cnt].value = num1[i].value;
++i;
}else if(j==n1||num1[i].ID<num2[j].ID){//
result[cnt].ID = num2[j].ID;
result[cnt].value = num2[j].value;
++j;
}else if(num1[i].ID==num2[j].ID){//
result[cnt].ID = num1[i].ID;
result[cnt].value = num1[i].value+num2[j].value;
++i; ++j;
}
++cnt;
}
int cnt1=0;
for(int i=0;i<cnt;++i){
if(result[i].value){
cnt1++;
}
}
printf("%d ",cnt1);
for(int i=0;i<cnt;++i){
if(result[i].value){
printf("%d %.1f",result[i].ID,result[i].value);//
if(i!=cnt-1)
printf(" ");
else
printf("\n");
}
}
return 0;
}
解题思路3(正确思路)
1.新建结果数组,类型为double
2. 读入第一行第一个数,接着直接用读入的数进行循环读入,用读入的整数当做结果数组的下标,进行 累加。
3. 第二行处理同上
4. 对结果数组不为零的个数进行累加,即可得出项数个数
5. 输出结果数不为0的下标和数值
代码部分
#include <cstdio>
const int N = 1111;
int main()
{
int n;
double p[N]={0};
double f;
int s = 2;
while(s--){
scanf("%d",&n);
while(n--){
int i;
scanf("%d%lf",&i,&f);
p[i] += f;
}
}
int cnt = 0;
for(int i=1000;i>=0;--i){
if(p[i])
cnt++;
}
/*
printf("%d ",cnt);
int j=0;
for(int i=1000;i>=0;--i){
printf("%d %.1f",i,p[i]);
j++;
if(j!=cnt)
printf(" ");
else
printf("\n");
}
*/
printf("%d",cnt);
for(int i=1000;i>=0;--i){
if(p[i])
printf(" %d %.1f",i,p[i]);
}
return 0;
}
注:输出的注释部分为我自己写的,后来参考了书,重新编写进行了改进。
遇到的问题
思路问题
上文提过,我忘记考虑了系数可能为负数的问题,而且输出的项都为非零项,以及不应该连续读入n1,n2
其余水平引起的问题
- for(int i=0,j=0;…;…) 可以这么写
- int i=0,j=0; 可以这么写
- 数组下标别写错了,比如if(num1[i].ID==num2[j].ID),一开始写成if(num1[i].ID等等与于num2[i].ID)了
- 几个if情况不应该并列,是if else关系
if(j==n2||num1[i].ID>num2[j].ID){
result[cnt].ID = num1[i].ID;
result[cnt].value = num1[i].value;
++i;
}else if(j==n1||num1[i].ID<num2[j].ID){//
result[cnt].ID = num2[j].ID;
result[cnt].value = num2[j].value;
++j;
}else if(num1[i].ID==num2[j].ID){//
result[cnt].ID = num1[i].ID;
result[cnt].value = num1[i].value+num2[j].value;
++i; ++j;
}
题目总结
这个题目最大的考点在于两个多项式正负数相加最后会抵消,就不会输出以及计数了。