设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0
。
输入样例:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
输出样例:
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0
各种的说明我都在代码里加了注解,正文我就不多说了,直接去代码里看就行哦
一杯茶,一包奶,一段代码写一天!
一盏灯,一双手,一个bug敲一宿!
加油程序猿!!!
import java.util.*;
//一元多项式的乘法与加法
public class Main {
//创建两个多项式,用数组保存
static ArrayList<list> list1=new ArrayList<>();
static ArrayList<list> list2=new ArrayList<>();
static ArrayList<list> list3=new ArrayList<>();//用于保存最开始的list1数据
static ArrayList<list> list4=new ArrayList<>();//用于保存最开始的list2数据
static ArrayList<list> list5=new ArrayList<>();//用于保存list3与list4相乘结果
static Scanner sc=new Scanner(System.in);
public static void main(String[] args) {
Main m=new Main();
int firstlist=sc.nextInt();//获取第一个多项式项数
list1= m.first(firstlist);
list3=list1;
int secondlist=sc.nextInt();//获取第二个多项式项数
list2= m.first(secondlist);
list4=list2;
m.powmethod(list3,list4);
m.maxmethod(list1,list2);
for (int i = 0; i < list5.size(); i++) { //遍历list5数组,去除尾部空格
if (i==list5.size()-1)
System.out.println(list5.get(i));
else System.out.print(list5.get(i)+" ");
}
if (list5.isEmpty())//如果为空
System.out.println("0 0");
for (int i = 0; i < list1.size(); i++) { //遍历list1数组,去除尾部空格
if (i == list1.size() - 1)
System.out.print(list1.get(i));
else System.out.print(list1.get(i) + " ");
}
if (list1.isEmpty())//如果为空
System.out.print("0 0");
}
/*数据初始化*/
ArrayList<list> first(int a){//初始化数据
ArrayList<list> arr=new ArrayList<>();
for (int i = 0; i < a; i++) {
int xishu=sc.nextInt();
int zhishu=sc.nextInt();
list l=new list(xishu,zhishu);
arr.add(l);//将多项式对象l存入数组中
}
if (a==0){//如果多项式为0项,则初始化0
list l=new list(0,0);
arr.add(l);
}
return arr;
}
/*下面方法为相加方法*/
void maxmethod(ArrayList<list> l1,ArrayList<list> l2){
int a=0,b=0;//
for (int i1 = 0; i1 < l2.size(); i1++) {//遍历两个数组,逐项对比,list1为母体
for (int i = 0; i < l1.size(); i++) {
if (l1.get(i).zhishu>l2.get(i1).zhishu){
//无需操作,list1元素后移
}
else if(l1.get(i).zhishu<l2.get(i1).zhishu){
//将list2插入到list1中list1元素的前边
if (l1.get(i).xishu==0)
l1.remove(i);
l1.add(i,l2.get(i1));
break;
}
else if(l1.get(i).zhishu==l2.get(i1).zhishu){
if (l1.get(i).xishu+l2.get(i1).xishu==0){//系数相加为0,则去除
l1.remove(i);
break;
}
list l=new list(l1.get(i).xishu+l2.get(i1).xishu,l2.get(i1).zhishu);
//系数相加,指数不变,将新的list替换list1中list1元素
l1.set(i,l);
break;
}
}
}
}
/*下面方法为相乘方法*/
void powmethod(ArrayList<list> l3,ArrayList<list> l4){
for (int i = 0; i < l3.size(); i++) {
for (int i1 = 0; i1 < l4.size(); i1++) {
//两个多项式逐个相乘,系数相乘,指数相加
list l=new list(l3.get(i).xishu*l4.get(i1).xishu,l3.get(i).zhishu+l4.get(i1).zhishu);
if (l3.get(i).xishu*l4.get(i1).xishu==0){
l.zhishu=0;l.xishu=0;
}
list5.add(l);
}
}
list5.sort(new Comparator<list>() {//排序方法,从大到小排序
@Override
public int compare(list o1, list o2) {
return o2.zhishu-o1.zhishu;
}
});
for (int i = 0; i < list5.size()-1; i++) {//将排好序的list5进行指数去重,系数相加
if (list5.get(i).zhishu==list5.get(i+1).zhishu){//指数相同则进行去重
if (list5.get(i).xishu+list5.get(i+1).xishu==0){//系数相加为0,则两个项都去除
list5.remove(i);
list5.remove(i);//删除i位后,i+1位占据i的位置,所以还是删除i位
}
else {
list5.get(i).xishu = list5.get(i).xishu + list5.get(i + 1).xishu;
list5.remove(i + 1);
}
}
}
}
}
class list{
/*创建多项式对象,便于储存多项式信息*/
int xishu=0;
int zhishu=0;
public list(int xishu, int zhishu) {
this.xishu = xishu;
this.zhishu = zhishu;
}
@Override
public String toString() {//重写toString,便于结果打印
return xishu+" "+zhishu;
}
}