PAT - A1002 A+B for Polynomials (25分) https://pintia.cn/problem-sets/994805342720868352/problems/994805526272000000
关键点:
- 注意两同幂次项相加 系数和为0时 该幂次项不要输出的特殊情况;
- 何时退出做运算的循环、如何实现控制,需要仔细考虑,且其与数组最小长度的取值相关(可用代码后附的数据做断点调试,观察三个“指针”值的变化);
通过代码(C/C++):
#include<stdio.h>
int main(){
double coef_AB[2][12]={{}}, coef_res[20]={}; // A、B与A+B的各项系数
int expo_AB[2][12]={{}}, expo_res[20]={}; // A、B与A+B的各项指数
// 上面A和B的系数与指数数组长度最小可取值为K的最大值10+1+1=12,并设初值0,关乎后续while循环的结束控制
int K;
for(int i=0;i<2;i++){
scanf("%d", &K);
for(int j=0;j<K;j++){
scanf("%d%lf", &expo_AB[i][j], &coef_AB[i][j]);
}
}
int i=0,j=0,k=0; // 三个指针分别对应A、B、A+B的系数数组位置
while(coef_AB[0][i]||coef_AB[1][j]){ // A、B两者系数均为0时即有效数据处理完毕,结束循环
if(expo_AB[0][i]==expo_AB[1][j]){
//相同幂次的项相加(其中有特殊情况:零次幂的项指数与空项指数默认值均为0,不过最多只会运算一次)
expo_res[k]=expo_AB[0][i];
coef_res[k]=coef_AB[0][i]+coef_AB[1][j];
if(coef_res[k]){ // 该项系数和不为0,才存入结果
k++;
}
i++;
j++;
}else if(expo_AB[0][i]>expo_AB[1][j]){
// A的当前处理项幂次高于B的当前处理项,直接存入结果
expo_res[k]=expo_AB[0][i];
coef_res[k]=coef_AB[0][i];
k++;
i++;
}else{
// B的当前处理项幂次高于A的当前处理项,直接存入结果
expo_res[k]=expo_AB[1][j];
coef_res[k]=coef_AB[1][j];
k++;
j++;
}
}
printf("%d", k);
for(int i=0;i<20&&coef_res[i]!=0;i++){
printf(" %d %.1f", expo_res[i], coef_res[i]);
}
return 0;
}
/*测试点2的可用测试数据
10 9 1.1 8 1.1 7 1.1 6 1.1 5 1.1 4 1.1 3 1.1 2 1.1 1 1.1 0 1.1
10 19 1 18 1 17 1 16 1 15 1 14 1 13 1 12 1 11 1 10 1
*/