/*多项式加法(5分)
题目内容:
一个多项式可以表达为x的各次幂与系数乘积的和,比如:
2x6+3x5+12x3+6x+20
现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出。
程序要处理的幂最大为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
*/
解题关键:
- 认真审题,不断试数,不断调试,重点难点在输出格式
- 输出的项大致分为5大类:分为常数项,指数为1的项,指数不为+1或-1的项,系数为1或-1的项,系数不为1或-1的项
- 当项的指数为1时,不输出项的指数,如x1 输出 x 即可
- 当(该项是输出的第一项) 并且 (项的系数为正数) 时,输出时 (项的前面不需要‘+’),而当(该项是输出的第一项) 并且(项的系数是负数)时,输出时(项的前面需要‘-’)
- 当(该项不是输出的第一项) 并且 (项的系数为正数) 时,输出时 (项的前面需要‘+’),而当(该项不是输出的第一项) 并且(项的系数是负数)时,输出时(项的前面需要‘-’)
- 注意会有输入的项的指数相同的情况
- 项的系数为0时不输出,但会输出常数项(即使常数项为0)
- 建议用剔除法,把不满足条件的情况剔除或把满足条件的情况保留的思路做这道题
- 解题思路一、(不太建议)用System.out.printf()函数直接输出一整个项,包括符号,项的系数,字母x,项的指数
(我写的程序代码是采用该思路,分类情况会比较多,虽然看起来会比较细致繁琐,但分类情况比较清晰明了,有助于理解题意,仅供参考)
- 解题思路二、(比较建议)用System.out.print()函数把一个项分成几部分输出,比如符号,项的系数,字母x,项的指数
(该思路代码会比较简洁,较容易用判断语句剔除不符情况,可自行根据上述思路进行改写)
解题思路一:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner inputScanner = new Scanner(System.in);
int[][] a = new int[101][2]; //java整型数组元素默认初始化为0,可利用java数组的这个关键特点做这道题
int i;
int temp;
int count = 0; //标记输入多项式的次数
while (count < 2) { //输入两个多项式
count++;
while (true) {
temp = inputScanner.nextInt();
a[temp][0] = temp; //二维数组的每一行的第一个元素a[temp][0]储存 ——项的指数,第二个元素a[temp][1]储存 ——项的系数
a[temp][1] += inputScanner.nextInt(); //关键是 += , 对应情况:如果用户输入的项的指数相同,那么就累加项的系数a[temp][1]
if (temp == 0) { //如果输入的项的指数为0,即输入常数项,那么结束本次多项式的输入
break;
}
}
}
int flag = 0; //标记是否是第一个输出的
for (i = 100; i > 1; i--) { //令 i >= 2, 目的是把指数a[i][0] == 1 的情况单独出来讨论
/*该项的指数在100 ~ 2并且 系数不等于0的数 才进行输出*/
if (a[i][1] != 0) {
/*第一个输出的数,根据系数a[i][1]是否等于1对输出的形式进行分类*/
if (flag == 0){
if (a[i][1] == 1) {
System.out.printf("x%d", a[i][0]);
}else if (a[i][1] == -1) {
System.out.printf("-x%d", a[i][0]);
}else if (a[i][1] > 1 || a[i][1] < -1){
System.out.printf("%dx%d", a[i][1], a[i][0]);
}
flag = 1; //做个标记,表明前面已经有输出的数了,作为后面判断的依据
/*不是第一个输出的数,根据系数a[i][1]是否等于1对输出的形式进行分类*/
}else {
if (a[i][1] > 1) {
System.out.printf("+%dx%d", a[i][1], a[i][0]);
}else if (a[i][1] == 1) {
System.out.printf("+x%d", a[i][0]);
}else if (a[i][1] < -1) {
System.out.printf("%dx%d", a[i][1], a[i][0]);
}else if (a[i][1] == -1) {
System.out.printf("-x%d", a[i][0]);
}
}
}
}
/*当该项的指数为1时,x的后面不用输出指数的1,所以把指数为1的情况单独拿出来对输出形式进行分类*/
if ( a[1][1] != 0) {
if (flag == 0) { //第一个输出的数,项的前面不用加上‘+’
if (a[1][1] == 1) { //系数等于1的情况直接输出x或-x
System.out.printf("x");
}else if (a[1][1] == -1) {
System.out.printf("-x");
}else { //系数不等于1的情况就输出系数和x
System.out.printf("%dx", a[1][1]);
}
flag = 1; //做个标记,表明前面已经有输出的数了,作为后面判断的依据
}else if (flag != 0) { //不是第一个输出的数,项的前面加上‘+’,其他 (根据系数是否等于1) 对 (输出形式的分类) 跟上面几行代码类似
if (a[1][1] == 1) {
System.out.printf("+x");
}else if (a[1][1] == -1) {
System.out.printf("-x");
}else if (a[1][1] > 1){
System.out.printf("+%dx", a[1][1]);
}else if (a[1][1] < -1) {
System.out.printf("%dx", a[1][1]);
}
}
}
/*当该项为常数项时,根据常数项是否大于0对输出形式进行分类*/
if (flag == 0) { //第一个输出的数,项的前面不带符号,直接输出该常数
System.out.printf("%d", a[0][1]);
}else { //不是第一个输出的数,项的前面注意符号
if (a[0][1] > 0){
System.out.printf("+%d", a[0][1]);
}else if (a[0][1] < 0) {
System.out.printf("%d", a[0][1]);
}else if (a[0][1] == 0) {
System.out.printf("+0");
}
}
}
}
解题思路二:
源代码地址: https://blog.csdn.net/qq_36667170/article/details/79889211?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
import java.util.Scanner;
public class Main {
private static Scanner in;
public static void main(String[] args) {
in = new Scanner(System.in);
int z=0,x=0,c=0,key=0,j;
int []s=new int [101];
while(in.hasNext()) {
z=in.nextInt();
x=in.nextInt();
s[z]+=x;
if(z==0) c++;
if(c==2) break; //读到两次指数为0,跳出循环
}
for(j=100;j>0;j--) {
if(s[j]!=0) {
key++;//记录是否是第一项
if(key==1) {//第一项直接输出
if(s[j]!=1)
System.out.print(s[j]);
System.out.print("x");
if(j!=1)
System.out.print(j);
}
else {//不是第一项输出“+”
if(s[j]>0) System.out.print("+");
if(s[j]!=1)
System.out.print(s[j]);
System.out.print("x");
if(j!=1)
System.out.print(j);
}
}
}
if(s[j]>=0&&key>0)System.out.print("+"); //最后一项一定是0次幂
System.out.print(s[j]);
}
}