PTA 02-线性结构2 一元多项式的乘法与加法运算

设计函数分别求两个一元多项式的乘积与和。

输入格式:输入分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

思路:一元多项式的指数不可重复,且一个指数对应一个系数,所以选择Map中的key-value进行存储,key存储指数,value存储系数。计算结果要求按指数降序输出,选择TreeMap存储,输入的多项式没有要求,可以用HashMap存储。

计算多项式乘积:用两重for循环实现,分别将多项式1中的每一项和多项式2相乘,再把所得的积求和。两项相乘所得的结果的指数是两个指数的和,系数是两个系数的积,若结果mulMap中没有该指数,直接把系数-指数对放到mulMap中,若有该指数,只要在原有的系数上加上这个系数。

计算多项式的和:先将多项式1放到结果addMap中,再遍历多项式2。对于多项式2的每一项,若结果addMap中没有该指数,直接把系数-指数对放到addMap中,若有该指数,只要在原有的系数上加上这个系数。

结果的输出:用一个flag表示是否有过非零项的输出。每次输出前先判断value,是0就看下一个元素,不是0就判断flag,如果flag是false就置为true但不输出空格,为true就输出一个空格,flag判断完之后,输出系数-指数对(这里flag用来控制第一次输出的系数-指数对前面没有空格,后面输出的系数-指数对的前面带有空格)。只要输出过一次非零项,flag就置为true,如果循环结束,flag仍为false,说明结果是零多项式,输出“0 0”。

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int value;                                                           //系数
        int key;                                                             //指数

        //以指数从大到小的顺序存储乘积结果
        Map<Integer,Integer> mulMap = new TreeMap<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return -o1.compareTo(o2);
            }
        }) ;

        //以指数从大到小的顺序存储加法结果
        Map<Integer,Integer> addMap = new TreeMap<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return -o1.compareTo(o2);
            }
        });

        //获取第一个多项式,指数作为key,系数作为value
        int n = scan.nextInt();
        Map<Integer,Integer> map1 = new HashMap<>(n);
        for (int i = 0; i < n; i++){
            value = scan.nextInt();
            key = scan.nextInt();
            map1.put(key,value);
        }

        //获取第二个多项式
        int m = scan.nextInt();
        Map<Integer,Integer> map2 = new HashMap<>(m);
        for (int i = 0; i < m; i++){
            value = scan.nextInt();
            key = scan.nextInt();
            map2.put(key,value);
        }

        //计算乘积
        for (int key1 : map1.keySet()){
            for (int key2 : map2.keySet()){
                int mulkey = key1 + key2;
                int mulValue = map1.get(key1) * map2.get(key2);
                if (mulMap.get(mulkey) == null){  
                    mulMap.put(mulkey,mulValue);                              //如果mulMap里没有mulkey,直接把mulkey,mulValue存入
                }else{
                    mulMap.put(mulkey,mulMap.get(mulkey) + mulValue);         //如果mulMap里已经有mulkey,在原有value上加上mulValue
                }
            }
        }

        //输出乘积
        Set<Integer> mulKeySet = mulMap.keySet();
        Iterator<Integer> iterator = mulKeySet.iterator();
        boolean flag = false;                                                 //控制空格的输出,并且用来判断结果是不是零多项式
            while (iterator.hasNext()){
                int next = iterator.next();
                if (mulMap.get(next) != 0) {                                  //系数不为0才输出,为0就看下一个
                    if (!flag) {                                              //第一次遇到非0的系数,将flag置为true
                        flag = true;
                    } else {                                                  //不是第一次遇到非0的系数,输出空格
                        System.out.print(" ");
                    } 
                    System.out.print(mulMap.get(next) + " " + next);          //输出“系数 指数” 
                }
            }
        
        //如果循环结束flag还是false,说明没有遇到非0的系数,即结果为零多项书,输出"0 0"
        if (!flag){
            System.out.print("0 0");                                          
        }
        System.out.println();

        //计算和
        addMap.putAll(map1);                                                 //复制多项式1
        for (int key2 : map2.keySet()){
                if (addMap.containsKey(key2)){
                    int addValue = addMap.get(key2) + map2.get(key2);      
                    addMap.put(key2,addValue);                               //如果addMap里有addkey,在原有value基础上加上map2中对应的value
                }else{
                    addMap.put(key2,map2.get(key2));                         //如果addMap里没有addkey,直接把addkey,addValue存入
                }
        }

        //输出加法多项式
        Set<Integer> addKeySet = addMap.keySet();
        Iterator<Integer> iterator1 = addKeySet.iterator();
        boolean flag1 = false;
            while (iterator1.hasNext()){
                int next = iterator1.next();
                if (addMap.get(next) != 0) {
                    if (!flag1) {
                        flag1 = true;
                    } else {
                        System.out.print(" ");
                    }
                    System.out.print(addMap.get(next) + " " + next);
                }
            }

        if (!flag1){
            System.out.print("0 0");
        }

    }

注意:上面的代码中,即使某些项的系数为0,也存到了结果mulMap和addMap中,所以在输出的时候将其屏蔽。

如果不想让结果Map中存储系数为0的项,改为下面的代码:

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int value;
        int key;
        Map<Integer,Integer> mulMap = new TreeMap<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return -o1.compareTo(o2);
            }
        }) ;
        Map<Integer,Integer> addMap = new TreeMap<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return -o1.compareTo(o2);
            }
        });

        int n = scan.nextInt();
        Map<Integer,Integer> map1 = new HashMap<>(n);
        for (int i = 0; i < n; i++){
            value = scan.nextInt();
            key = scan.nextInt();
            map1.put(key,value);
        }

        int m = scan.nextInt();
        Map<Integer,Integer> map2 = new HashMap<>(m);
        for (int i = 0; i < m; i++){
            value = scan.nextInt();
            key = scan.nextInt();
            map2.put(key,value);
        }

        for (int key1 : map1.keySet()){
            for (int key2 : map2.keySet()){
                int mulkey = key1 + key2;
                int mulValue = map1.get(key1) * map2.get(key2);
                if (mulMap.get(mulkey) == null){
                    if (mulValue != 0){
                        mulMap.put(mulkey,mulValue);
                    }
                }else{
                    int sum = mulMap.get(mulkey) + mulValue;
                    if (sum != 0){
                        mulMap.put(mulkey,sum);
                    }else{
                        mulMap.remove(mulkey);
                    }
                }
            }
        }

        Set<Integer> mulKeySet = mulMap.keySet();
        Iterator<Integer> iterator = mulKeySet.iterator();
        boolean flag = false;
        if (mulKeySet.size() != 0){
            while (iterator.hasNext()){
                int next = iterator.next();
                if (!flag) {
                    flag = true;
                } else {
                    System.out.print(" ");
                }
                System.out.print(mulMap.get(next) + " " + next);                
           }
        }else{
            System.out.print("0 0");
        }
        System.out.println();

        addMap.putAll(map1);
        for (int key2 : map2.keySet()){
            if (addMap.containsKey(key2)){
                int addValue = addMap.get(key2) + map2.get(key2);
                if (addValue != 0){
                    addMap.put(key2,addValue);
                }else{
                    addMap.remove(key2);
                }
            }else{
                int value2 = map2.get(key2);
                if (value2 != 0){
                    addMap.put(key2,value2);
                }
            }
        }

        Set<Integer> addKeySet = addMap.keySet();
        Iterator<Integer> iterator1 = addKeySet.iterator();
        boolean flag1 = false;
        if (addKeySet.size() != 0){
            while (iterator1.hasNext()){
                int next = iterator1.next();
                if (!flag1) {
                    flag1 = true;
                } else {
                    System.out.print(" ");
                }
                System.out.print(addMap.get(next) + " " + next);
                }
        }else{
            System.out.print("0 0");
        }
    }
}    

以乘法运算为例,我之前的想法是,计算mulMap时不判断系数是否为0,得到所有系数-指数对以后,再剔除value为0的元素(我是以keySet的foreach循环对mulMap中的元素进行遍历,遇到value为0的元素就调用remove(),但是会报ConcurrentModificationException,这个不知道怎么改。)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值