打印多项式的那些坑(洛谷P1067题题解,Java语言描述)
前言
我之前寫過一篇有關(guān)解一元一次方程的那些坑的博客,那個題的細(xì)節(jié)還是比較多的,對于沒經(jīng)驗(yàn)的人呢,確實(shí)是各種WAWA大哭。
這里是多項(xiàng)式,按照格式打,看下去,讓我們看看有哪些坑吧~~
(也是黃題,稍有麻煩,不算太難)
題目要求
P1067題目鏈接
分析
我們要明確,最高位固定的情況下,N位一共有N+1項(xiàng)。
首先是單獨(dú)的常數(shù)項(xiàng)或者ax+b兩種大情況。
為什么單獨(dú)拎出來呢?
因?yàn)楸热缯f二次項(xiàng),ax^2,但一次項(xiàng)是ax,不能寫成 ax^1。
如果不加以特判的話,開始項(xiàng)就不能得以區(qū)分。
在處理細(xì)節(jié)的時候注意:
- 開頭項(xiàng)的+不顯示,但-顯示;非開頭項(xiàng)的+要作為加號進(jìn)行連接,這是一個細(xì)節(jié)。
- 當(dāng)系數(shù)為0的時候,就一定要去掉這一項(xiàng)(不顯示)。
- 很坑的一個問題是我們可以寫x^2+1,不能寫 1x^2+1,這不符合習(xí)慣。
(這也是我第一次WA的原因)
在多次項(xiàng)(當(dāng)次數(shù)大于等于2的時候,進(jìn)行常規(guī)判斷流程)進(jìn)行連接的時候,連接用+和-,但負(fù)數(shù)本身帶-,正數(shù)不帶+,所以要在正數(shù)前補(bǔ)“+”,負(fù)數(shù)則權(quán)當(dāng)忽略不做處理。畢竟負(fù)號和減號在連接的時候等價。
要將后面特殊的一次項(xiàng)和常數(shù)項(xiàng)進(jìn)行特殊化處理,當(dāng)做尾部連接部分連接上去。
再說說Java處理這種問題的一些語法細(xì)節(jié)。
為了避免多種情況的嵌套,我們可以不做else處理,而是對已有步驟直接進(jìn)行System.out.println()然后return; main()方法也是一個函數(shù),return即可結(jié)束函數(shù)。
鑒于大量的運(yùn)用“+”進(jìn)行字符串連接效率低(因?yàn)橐D(zhuǎn)StringBuilder然后開循環(huán)balabala),直接用StringBuilder就好啦~~
感興趣的可以康康代碼,容易理解,Fine~
第一次提交WA掉了,Share一下評測數(shù)據(jù)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
(請注意我加了兩個空格(方便博客的顯示),但實(shí)際上是沒有的,請務(wù)必注意)
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();} }總結(jié)
以上是生活随笔為你收集整理的打印多项式的那些坑(洛谷P1067题题解,Java语言描述)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【面向对象】面向对象程序设计测试题14-
- 下一篇: 【Java】不使用比较运算符构造max(