1002
问题:A+B Polynomials
分析考虑!
可以很容易想到用数组,数组下标i代表第 xi 项,然后将系数存放在对应下标位置。用两次循环读入,读入到到数组对应位置。考虑到可能包含重复的项,在写入数组时要注意,重复项需要累加,于是写入到数组时我们采用累加的方式。同时还需要注意边界,范围是0-1000,意味着数组下标可以从0-1000,也就是数组的大小为1001。然后考虑输出部分我们输出项数,所以我们需要先遍历计数系数不为0的项,即当某个下标对应值不为0时,我们让count++。开始输出,先输出项,count,然后从高到低遍历数组,当系数不为0时,我们才将下标以及对应值输出。
开始动手!
#include <stdio.h>
#define MAXSIZE 1001
double arr[MAXSIZE];
int main(void)
{
int num;
int i;
double value;
//处理第一行输入
scanf("%d",&num);
while(num--)
{
scanf("%d %lf",&i,&value);
arr[i] += value;
}
//处理第二行输入
scanf("%d",&num);
while(num--)
{
scanf("%d %lf",&i,&value);
arr[i] += value;
}
//找出多少项
int count = 0;
for(i = 0;i < MAXSIZE;i++)
if(arr[i] != 0)
count++;
//开始输出
printf("%d",count);
for(i = MAXSIZE - 1;i >= 0;i--)
if(arr[i] != 0)
printf(" %d %.1f",i,arr[i]);
return 0;
}
回顾反思!
- 刚开始我用了三个数组,分别存放第一次输入第二次输入以及汇总处理后的数据,但是后来发现没必要。其实用一个数组就完全可以了。
- 第一次提交的时候,只部分正确,由于没考虑到输入的项可能是相同项的问题,具体操作时用的赋值,即arr[i] = value; 这样一来的,当某一行含有重复项时,系数会被擦写。所以我更新了代码,采用累加的方式,这样即使包含重复项,我们也可以将系数累加起来。
- 边界问题,0-1000项这一题目要求开始没仔细看,数组我设定成了大小为1000的,最后导致一个编译点始终过不去,然后我再回头看题目要求,发现我的数组大小没给够!
what‘s more
数据结构和算法还没学,甲级第三题真的刷不动了。似乎是需要一个求最短路径的算法(我也不知道是不是叫这个名字。。。),以我现在的能力自己实现起来有点困难。
so
从2019.12.19日起开始学习数据结构和算法,明年二月份再开始刷PAT甲级。