【7003】&&【a203】合并多项式
阅读原文时间:2023年07月16日阅读:1

Time Limit: 3 second

Memory Limit: 2 MB

问题描述

     求两个一元多项式的和。输入多项式方式为:多项式项数、每项系数和指数,按指数从大到小的顺序输入。输出多项式方式为:多项式项数、每项系数和指数,按指数从大到小的顺序输出,合并后的系数如果为0,则不输出该项。(假设系数、指数均为整数)

Input

输入n+m+2行,第一行输入为第一个多项式的项数n,接下来的n行的是第一个多项式的系数和指数。接着是第二个多项式的项数m,接下来的m行是第二个多项式的系数和指数。(系数与指数用一个空格隔开)

Output

输出若干行,第一行是合并后多项式的项数K,接下来的K行是每行多项式的系数和指数。(系数与指数用一个空格隔开)

Sample Input

4  
-5 6  
3 2  
1 1  
8 0  
5  
8 9  
6 6  

-3 2
5 1
-20 0

Sample Output

4  
8 9  
1 6  
6 1  
-12 0

【题解】

设置一个bo,数组,用来存指数为x的系数bo[x]。输入x,y 令bo[y]+=x即可,要注意y可能为负数,所以要设置一个zbo 和fbo数组,表示y是整数和负数的情况。

最后从一个很大的数递减到0,遇到bo[i]!=0 就输出 bo[i] 和i即可。然后是负数 ,从1到一个很大的数进行输出 遇到bo[i]!=0,输出bo[i]和-i;

【代码】

#include
#include

int n,m,zbo[100000],fbo[100000],num = 0;

void input_data()
{
memset(zbo,0,sizeof(zbo));
memset(fbo,0,sizeof(fbo));//memset函数用于初始化,头文件是cstring
scanf("%d",&n); //输入第一个多项式的项数
for (int i = 1;i <= n;i++) //依次输入n个项 { int x,y; scanf("%d %d",&x,&y); if (y >= 0)
zbo[y] += x;
else
fbo[-y] += x;
}
scanf("%d",&m); //输入第二个多项式的项数
for (int i = 1;i <= m;i++) //依次输入m个项 { int xx,yy; scanf("%d %d",&xx,&yy); if (yy >= 0)
zbo[yy] += xx;
else
fbo[-yy] += xx;
}
}

void output_ans()
{
for (int i = 99999;i >= 0;i--) //先要统计要输出的个数。
if (zbo[i] != 0)
num++;
for (int i = 1;i <=99999;i++)
if (fbo[i] != 0)
num++;

printf("%d\\n",num);

for (int i = 99999;i >= 0;i--) //输出完个数之后再输出具体的项。  
    if (zbo\[i\] != 0)  
        printf("%d %d\\n",zbo\[i\],i);  
for (int i = 1;i <=99999;i++)  
    if (fbo\[i\] != 0)  
        printf("%d %d\\n",fbo\[i\],-i);  

}

int main()
{
//freopen("F:\\rush.txt","r",stdin);
input_data();
output_ans();
return 0;
}

【代码】

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章