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();
}
}
- 因为才学习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.最后我就在网上找了一份代码,然后通过了。算法流程如下:
总结:
我总是想着要少占一点空间,所以总是选择用时间来换空间的算法,但是很明显有的时候这个是不需要的。就像这道题,直接定义一个最大容量的数组。后面的算法就会很简单,整个代码也很优美。