我的解法
我对输入要求有误解,以为
必须是从大到小排列且不重复的,所以有好几个测试点不通过。
#include<iostream>
#include<string>
using namespace std;
int main(){
float k1,k2;
float s1[1001],s2[1001],s3[1001];
int k=0;char c;
cin>>s1[k++];
while((c=getchar())!='\n'){
cin>>s1[k++];
}
k=0;
cin>>s2[k++];
while((c=getchar())!='\n'){
cin>>s2[k++];
}
k1=s1[0];k2=s2[0];
int count=0;
for(int i=1;i<=k1*2;i=i+2){
for(int j=1;j<=k2*2;j=j+2){
if(s1[i]<s2[j]){
s3[count]=s2[j];
s3[count+1]=s2[j+1];
count=count+2;
s2[j]=-1;
continue;
}
else if(s1[i]>s2[j]){
s3[count]=s1[i];
s3[count+1]=s1[i+1];
count=count+2;
s1[i]=-1;
break;
}
else{
if(s1[i+1]+s2[j+1] != 0){
s3[count]=s1[i];
s3[count+1]=s1[i+1]+s2[j+1];
count=count+2;
s1[i]=-1;s2[j]=-1;
}
}
}
}
cout<<count/2;
for(int i=0;i<count;i++){
cout<<" "<<s3[i];
}
return 0;
}
很小巧的代码,优美~
#include<cstdio>
int main(){
//输入用于记录每个多项式总项数的k,幂n,系数a,计数相加后多项式总项数的count
int k,n,count=0;
double p[1111]={0};
double a;
//输入第一个多项式的总项数和每一项
scanf("%d",&k);
for(int i=0;i<k;i++){
scanf("%d %lf",&n,&a);
p[n]+=a;
}
//输入第二个多项式的总项数和每一项
scanf("%d",&k);
for(int i=0;i<k;i++){
scanf("%d %lf",&n,&a);
p[n]+=a;
}
//计算不为零的所有多项式的
for(int i=0;i<1111;i++){
if(p[i]!=0){
count++;
}
}
//输出一行末尾不空格的简洁写法
printf("%d",count);
for(int i=1110;i>=0;i--){
if(p[i]!=0){
printf(" %d %.1lf",i,p[i]);
}
}
return 0;
}
学习的点
1.把
值作为数组下标,把
作为数组值这一个trick,感觉特别巧妙,在输入过程中就直接把
相同的
累加到了同一个位置上,比我的方法舒服的多~这个思路很值得积累。
2.另外实验了一下,输入数组的时候,空格间隔或者换行间隔都是可以的。
3.题目对输出的数字格式有要求,保留小数点后一位,写法:printf("%.1lf",p[i])。我感觉C的输出要比C++灵活一点,是这样吗?
讨论的点
1.已经很久很久没有用过C了,其实C++也很久没用了,但是相比于C来说还熟悉一些,不过有些地方是要求必须用标准C的,所以也要温习一下C。
2.其他的没啥可讨论的,感觉优美解法非常好。