前言
我之前写过一篇有关解一元一次方程的那些坑的博客,那个题的细节还是比较多的,对于没经验的人呢,确实是各种WAWA大哭。
这里是多项式,按照格式打,看下去,让我们看看有哪些坑吧~~
(也是黄题,稍有麻烦,不算太难)
题目要求
分析
我们要明确,最高位固定的情况下,N位一共有N+1项。
首先是单独的常数项或者ax+b两种大情况。
为什么单独拎出来呢?
因为比如说二次项,ax^2,但一次项是ax,不能写成 ax^1。
如果不加以特判的话,开始项就不能得以区分。
在处理细节的时候注意:
- 开头项的+不显示,但-显示;非开头项的+要作为加号进行连接,这是一个细节。
- 当系数为0的时候,就一定要去掉这一项(不显示)。
- 很坑的一个问题是我们可以写x^2+1,不能写 1x^2+1,这不符合习惯。
(这也是我第一次WA的原因)
在多次项(当次数大于等于2的时候,进行常规判断流程)进行连接的时候,连接用+和-,但负数本身带-,正数不带+,所以要在正数前补“+”,负数则权当忽略不做处理。毕竟负号和减号在连接的时候等价。
要将后面特殊的一次项和常数项进行特殊化处理,当做尾部连接部分连接上去。
再说说Java处理这种问题的一些语法细节。
为了避免多种情况的嵌套,我们可以不做else处理,而是对已有步骤直接进行System.out.println()然后return; main()方法也是一个函数,return即可结束函数。
鉴于大量的运用“+”进行字符串连接效率低(因为要转StringBuilder然后开循环balabala),直接用StringBuilder就好啦~~
感兴趣的可以康康代码,容易理解,Fine~
第一次提交WA掉了,Share一下评测数据3
in
99
-1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 100 1 8
out
-x^99 -7x^50 +100x^2+x+8
(请注意我加了两个空格(方便博客的显示),但实际上是没有的,请务必注意)
AC代码(Java语言描述)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
if (num == 0) {
System.out.println();
return;
}
int head = scanner.nextInt();
if (num == 1) {
System.out.println(head);
return;
} else if (num == 2) {
int rear = scanner.nextInt();
if (head == 1) {
System.out.print("x");
} else if (head == -1) {
System.out.print("-x");
} else {
System.out.print(head + "x");
}
if (rear > 0) {
System.out.println("+" + rear);
} else if (rear < 0) {
System.out.println(rear);
}
return;
}
StringBuilder builder = new StringBuilder();
if (head == 1) {
builder.append("x^" + num);
} else if (head == -1) {
builder.append("-x^" + num);
} else {
builder.append(head + "x^" + num);
}
for (int i = num-1; i >= 2; i--) {
int temp = scanner.nextInt();
if (temp == 1) {
builder.append("+x^" + i);
} else if (temp == -1) {
builder.append("-x^" + i);
} else if (temp > 0) {
builder.append("+" + temp + "x^" + i);
} else if (temp < 0) {
builder.append(temp + "x^" + i);
}
}
int first = scanner.nextInt();
if (first == 1) {
builder.append("+x");
} else if (first == -1) {
builder.append("-x");
} else if (first > 0) {
builder.append("+" + first + "x");
} else if (first < 0) {
builder.append(first + "x");
}
int rear = scanner.nextInt();
if (rear > 0) {
builder.append("+" + rear);
} else if (rear < 0) {
builder.append(rear);
}
System.out.println(builder.toString());
scanner.close();
}
}