编程小白的PAT试题笔记_A1002 A+B for Polynomials


本次编程训练以20分钟为一个单位划分,第一个15分钟思考了解题思路,需要用到什么结构工具,第二个15分钟进行了编程及测试,在编写结束后调试时发现了很多问题,参考了 《算法笔记》之后对代码分别进行了修改和重新编写。本文涉及题目思路部分(思路和边界清情况),代码部分,遇到的问题,对题目的总结。

PS.真的是纯小白一个,数据结构还没有学完…c++用的也没有很熟练,代码写的还有些麻烦,不好看甚至说很蠢…有问题还请各位大佬批评指正(认真的鞠躬)。

思路部分

解题思路

解题思路1(有错误的思路)

此版本为最开始的思路。

  1. 连续读入变量n1,n2
  2. 读入后边的多项式系数等
  3. i =0,j=0;
  4. 新建结构体,成员为一个int类型和double类型
  5. 为读入第一行第二行新建结构体数组,大小为11
  6. 创建结果数组,大小为22
  7. 循环:
    if(jn2||num1[i].ID>num2[j].ID)
    if(j
    n1||num1[i].ID<num2[j].ID)
    if(num1[i].ID==num2[j].ID)
    在这三种情况下依次判断进行计算,用一个变量cnt作为计数器,在循环中递增
  8. 输出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

其余水平引起的问题
  1. for(int i=0,j=0;…;…) 可以这么写
  2. int i=0,j=0; 可以这么写
  3. 数组下标别写错了,比如if(num1[i].ID==num2[j].ID),一开始写成if(num1[i].ID等等与于num2[i].ID)了
  4. 几个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;
		}

题目总结

这个题目最大的考点在于两个多项式正负数相加最后会抵消,就不会输出以及计数了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值