Java实现-多项式加法(慕课)

/*多项式加法(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
*/
解题关键:

  1. 认真审题,不断试数,不断调试,重点难点在输出格式
  2. 输出的项大致分为5大类:分为常数项,指数为1的项,指数不为+1或-1的项,系数为1或-1的项,系数不为1或-1的项
  3. 当项的指数为1时,不输出项的指数,如x1 输出 x 即可
  4. 当(该项是输出的第一项) 并且 (项的系数为正数) 时,输出时 (项的前面不需要‘+’),而当(该项是输出的第一项) 并且(项的系数是负数)时,输出时(项的前面需要‘-’)
  5. 当(该项不是输出的第一项) 并且 (项的系数为正数) 时,输出时 (项的前面需要‘+’),而当(该项不是输出的第一项) 并且(项的系数是负数)时,输出时(项的前面需要‘-’)
  6. 注意会有输入的项的指数相同的情况
  7. 项的系数为0时不输出,但会输出常数项(即使常数项为0)
  8. 建议用剔除法,把不满足条件的情况剔除或把满足条件的情况保留的思路做这道题
  • 解题思路一、(不太建议)用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]);
	}
}

发布了9 篇原创文章 · 获赞 4 · 访问量 274

猜你喜欢

转载自blog.csdn.net/Hunter_Kevin/article/details/105237143
今日推荐