1002 A+B for Polynomials (25分)

问题

This time, you are supposed to find A+B where A and B are two polynomials.(多项式相加)。

解决思路

1. 一开始打算用数组来解决这个问题,但是在算法流程的时候发现有的问题我解决不了。算法流程如下:

 因为这个是因为的题目,所以我没有理解到其中一句话。就是"K is the number of nonzero terms in the polynomial",我翻译的是K 非零,但是别人的意思是非零项的个数。所以我就不敢把系数等于0作判断条件。所以我直接把每一项都输出了。
整个算法我也实现了,用的java,但是分数只得到一点点。有想法的兄弟可以帮我改一改。

import java.util.Scanner;
class Main{
    public static void main(String[] args)
    {
        int N1,N2; //一共有多少项
        int a1,b1;//最大项
        int t;
        Scanner dataIn = new Scanner(System.in);
        N1 = dataIn.nextInt();
        t = a1 = dataIn.nextInt();
        double[] A = new double[a1+1];
        A[t] = dataIn.nextDouble();
        for(int i=1;i<N1;i++)
        {
            t = dataIn.nextInt();
            A[t] = dataIn.nextDouble();
            
        }
        N2 = dataIn.nextInt();
        t = b1 = dataIn.nextInt();
        double[] B = new double[b1+1];
        B[t] = dataIn.nextDouble();
        for(int i=1;i<N2;i++)
        {
            t = dataIn.nextInt();
            B[t] = dataIn.nextDouble();
            
        }  
        
        //交换赋值
        if(a1<b1)
        {
            double[] td;
            int ti;
            td = B;
            B = A;
            A = td;
            ti = b1;
            b1 = a1;
            a1 = ti;
        }
        t =a1+1;
        System.out.print(t);
        for(int i=a1;i>=0;i--)
        {
            
            if(b1>=i)
            {
                A[i] += B[i];
            }
            System.out.print(" "+ i +" "+A[i]);
        }
        System.out.println();
    }
}
  1. 因为才学习java所以可能之后自己在做算法题的时候都会优先选择java,但是我其实觉得C/C++来做这个编程题会更有感觉。没办法谁让自己是java初学者呢。所以,因为上面的代码行不通我就想,到了java里面的HashMap类,这个我就不贴算法流程了。直接看代码:
      import java.util.Scanner;
import java.util.Set;
import java.util.HashMap;
import java.util.Map.Entry;
public class Main
{
    public static void main(String[] args)
    {
        int K1,K2;                                              //一共有多少项
        HashMap<Integer,Double> res = new HashMap<Integer,Double>();          //Hash表存储相关加数
        Scanner scanner = new Scanner(System.in);               //控制台输入
        K1 = scanner.nextInt();
        for(int i=K1;i>0;i--)
        {
            res.put(scanner.nextInt(),scanner.nextDouble());
        }
        K2 = scanner.nextInt();
        for(int i=K2;i>0;i--)
        {
            Integer term = scanner.nextInt();
            if(res.containsKey(term))
            {
                Double j = res.get(term);
                j += scanner.nextDouble();
                res.put(term,j);
            }
            else
            {
                res.put(term,scanner.nextDouble());
            }
        }
        System.out.print(res.size());
        Set<Integer> keys = res.keySet();   //获得键值集合
        Object[] keyArr = keys.toArray();
        for(int i=(keyArr.length-1);i>=0;i--)
        {
            Integer t = (Integer)keyArr[i];
            System.out.printf(" %d %.1f",t,res.get(t));
        }
        System.out.println();
    }
}

 当这个代码也有问题,可是我没有管它了。因为我发现这个代码运行在PAT时连答案问题类型提示都会发生改变。希望这份代码也可以被哪一位大佬改一下。
3.最后我就在网上找了一份代码,然后通过了。算法流程如下:

总结:

我总是想着要少占一点空间,所以总是选择用时间来换空间的算法,但是很明显有的时候这个是不需要的。就像这道题,直接定义一个最大容量的数组。后面的算法就会很简单,整个代码也很优美。

posted @ 2021-01-31 21:32  lisui  阅读(66)  评论(0编辑  收藏  举报