在网易云课堂上的《Java应用基础:入门篇》中有这样一道题,多项式加法:
一个多项式可以表达为x的各次幂与系数乘积的和,比如:(下图中倒数第二项应该是6x,而不是6的x次幂)
现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出。
程序要处理的幂最大为100。
输入格式:
总共要输入两个多项式,每个多项式的输入格式如下:
每行输入两个数字,第一个表示幂次,第二个表示该幂次的系数,所有的系数都是整数。第一行一定是最高幂,最后一行一定是0次幂。
注意第一行和最后一行之间不一定按照幂次降低顺序排列;如果某个幂次的系数为0,就不出现在输入数据中了;0次幂的系数为0时还是会出现在输入数据中。
输出格式:
从最高幂开始依次降到0幂,如:
- 2x6+3x5+12x3-6x+20
注意其中的x是小写字母x,而且所有的符号之间都没有空格,如果某个幂的系数为0则不需要有那项。
输入样例:
6 2
5 3
3 12
1 6
0 20
6 2
5 3
2 12
1 6
0 20
输出样例:
4x6+6x5+12x3+12x2+12x+40
=====================================================================================
这是数组章节里的一道题,在刚拿到这道题的时候,第一反应就是数组的下表刚好可以用来表示幂,for语句两次循环后把每项系数相加赋值给数组元素,然后逆向输出即可。这样简单的一写,用题目的输入完全可以得出正确的输出。可是放在用例测试却4个用例只通过了1个。。。
后来尝试了些不同的输入,发现之前的代码跳进很多坑里,其中比较容易忽视的:
A.输出时某一项系数为1或者-1时;
B.相加为0时。
这道题从技术上来说没有多大难度,主要在于逻辑的完备思考。所以我用了一个比较笨拙的方法,用一个二维数组而非一维数组。其中第一行数组元素为每项的系数,第二行对应的数组元素为洗漱的类别,其中有4种类别:
第1类:系数为1
第2类:系数>1
第3类:系数为-1
第4类:系数<-1
与此同时,需要分以下3种情况:
幂次>1
幂次=1
幂次=0
具体代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int polynomial[][] = new int[2][101];
int power;
for (int i = 0; i < 2; i++) {
do {
power = in.nextInt();
int coefficient = in.nextInt();
polynomial[0][power] += coefficient;
} while (power != 0);
}
for (int i = 0; i < polynomial[0].length; i++) {
if (polynomial[0][i] > 0) {
if (polynomial[0][i] == 1) {
polynomial[1][i] = 1; //第1类:系数为1
} else {
polynomial[1][i] = 2; //第2类:系数>1
}
} else {
if (polynomial[0][i] == -1) {
polynomial[1][i] = 3; //第3类:系数为-1
} else {
polynomial[1][i] = 4; //第4类:系数<-1
}
}
}
StringBuilder output = new StringBuilder();
boolean isFirst = true;
boolean isAllZero = true;
for (int i = polynomial[0].length - 1; i >= 0; i--) {
String str;
if (polynomial[0][i] != 0) {
isAllZero = false;
switch (polynomial[1][i]) {
case 1: //第1类:系数为1
if (i > 1) {
str = "x" + i;
} else if (i == 1) {
str = "x";
} else {
str = "1";
}
if (isFirst) {
output.append(str);
isFirst = false;
} else {
output.append("+").append(str);
}
break;
case 2: //第2类:系数>1
if (i > 1) {
str = polynomial[0][i] + "x" + i;
} else if (i == 1) {
str = polynomial[0][i] + "x";
} else {
str = String.valueOf(polynomial[0][i]);
}
if (isFirst) {
output.append(str);
isFirst = false;
} else {
output.append("+").append(str);
}
break;
case 3: //第3类:系数为-1
if (i > 1) {
str = "-x" + i;
} else if (i == 1) {
str = "-x";
} else {
str = "-1";
}
output.append(str);
break;
case 4: //第4类:系数<-1
if (i > 1) {
str = polynomial[0][i] + "x" + i;
} else if (i == 1) {
str = polynomial[0][i] + "x";
} else {
str = String.valueOf(polynomial[0][i]);
}
output.append(str);
break;
}
}
}
if (isAllZero) {
System.out.print(0);
} else {
System.out.print(output);
}
}
}
这个方法比较繁琐,也太不好理解。不知有什么更好的方法来解决这个问题,还希望各位大侠各位前辈多指点哦~