标签:遇到 代码量 相加 -- clu ons 相同 exp printf
题意:模拟多项式相加。
思路:
方法1、建立一个结构体表示每一项。然后分别输入多项式a、b。由于输入的顺序是按照指数递减的,因此在执行a+b的时候,可以使用双指针法,当遇到指数相同的项数,将两者的系数相加。不过需要注意,系数之和为0的情况。
方法2、建立一个double p[N],初始化为0,其中p[exp]表示指数为exp的系数。每读入一项,只要执行p[exp] += coe;就好了。最后输出的时候,逆序输出,因为要求指数大的放前面。这一种方法代码量少很多。
代码1:
#include <cstdio> struct Term{ double coe;//系数 int exp;//指数 }a[100],b[100],sum[100]; int main() { //freopen("pat.txt","r",stdin); int ka,kb; scanf("%d",&ka); for(int i=0;i<ka;i++) scanf("%d%lf",&a[i].exp,&a[i].coe); scanf("%d",&kb); for(int i=0;i<kb;i++) scanf("%d%lf",&b[i].exp,&b[i].coe); int i=0,j=0,len=0; while(i<ka && j<kb){ if(a[i].exp==b[j].exp){ if(a[i].coe+b[j].coe==0){ i++; j++; continue; } sum[len].exp=a[i].exp; sum[len].coe=a[i].coe+b[j].coe; len++; i++; j++; }else if(a[i].exp<b[j].exp){ sum[len].exp=b[j].exp; sum[len].coe=b[j].coe; len++; j++; }else{ sum[len].exp=a[i].exp; sum[len].coe=a[i].coe; len++; i++; } } while(i<ka){ sum[len].exp=a[i].exp; sum[len].coe=a[i].coe; len++; i++; } while(j<kb){ sum[len].exp=b[j].exp; sum[len].coe=b[j].coe; len++; j++; } printf("%d",len); for(int i=0;i<len;i++){ printf(" %d %.1f",sum[i].exp,sum[i].coe); } return 0; }
代码2:
#include <cstdio> const int N = 1100; int main() { double p[N]={0};//p[exp]表示指数为exp的系数 int k; int exp;//指数 double cof;//系数 scanf("%d",&k); for(int i=0;i<k;i++){ scanf("%d%lf",&exp, &cof); p[exp] += cof; } scanf("%d",&k); for(int i=0;i<k;i++){ scanf("%d%lf",&exp, &cof); p[exp] += cof; } int count = 0; for(int i=0;i<N;i++){ if(p[i] != 0) count++; } printf("%d",count); for(int i=N-1;i>=0;i--){ if(p[i] != 0) printf(" %d %.1f",i, p[i]); } return 0; }
标签:遇到 代码量 相加 -- clu ons 相同 exp printf
原文地址:https://www.cnblogs.com/kkmjy/p/9559642.html