hdu 2424

用java寫高精度雖然簡單,但是其中的原理必須得想清楚了!

這個題目是給出一個算式,期中只有數字 ,加號,乘號,空格這四種種元素。通過這個算式計算出一個結果。基本思想就是:用next()一個元素一個元素的讀取,其中讀到空格的地方表示一個標記被完全讀取!對於不同的標記,有不同的處理方法!

       這個題目有幾個規律性的地方需要提一下:

1 一個算式的標記出空格和回車外一定是有奇數個的;

2忽略空格,從鍵盤輸入的偶數個標記一定是一個數字(因爲數組的下標是從0開始的),而奇數個字符必定是加號或者乘號,不符合這個規定的必定得不出結果。

  3如果此時輸入的數字,要查看其前邊輸入的是否爲乘號,如果是直接可以相乘,符合運算法則;如果此時輸入的是加號的話,那麼其上次輸入的加號就可以進行運                   算了。所以此時標誌數字的那個變量

import java.math.BigInteger;
import java.util.Scanner;

public class Main2424 {
	public static void main(String[] args){
		Scanner cin = new Scanner(System.in);
		int n;  						           //用來指示表達式中的符號
		String[] f = new String[30];  	           //字符數組
		BigInteger[] num = new BigInteger[30];     //大數數組
		String str;
		long k = 0;
		f[0] = "1";
		while(cin.hasNext()){
			int flag = 1,ntop = 0,stop = 0;
			k++;                                   //用來標記第幾個測試用例
			n=cin.nextInt();
			if(n%2==0)flag=0;                      //flag 標誌變量
			for(int i=0; i<n; i++){
				str = cin.next();                  //查找並返回此掃描器的第一個標記  也就是掃描一行中的第一個標記  遇到空格掃描結束
				if(flag == 0)continue;             //至少能表示掃描的不是第一個標記
				if(i%2==0&&(!str.equals("+")&&(!str.equals("*")))){//表示第二個字符不是+ 或者 *的處理  如何是數字而不是* +表示合理
					BigInteger w = new BigInteger(str);            //調用大數的構造方法 將字符串轉換成大數
					num[++ntop] = w;                               //在數組的第一個位置存儲下這個大數
					if(f[stop].equals("*")){                       //stop是用來標記+和*的位置的 至少在第一次時候不會執行這一句
						num[ntop-1] = num[ntop].multiply(num[ntop-1]);//高精度乘法
						ntop--;
						stop--;
					}
				}else if(i%2!=0&&(str.equals("+")||str.equals("*"))){//對於是+或者*而不是數字的處理
					f[++stop] = str;                                 //將這個字符串保存下來
					if(f[stop].equals("+")&&ntop>1){                 //如果是+表示當前的數字需要同前面的數字先進行運算了
						num[ntop-1] = num[ntop].add(num[ntop-1]);
						ntop--;
						stop--;
					}
				}else {
					flag = 0;
				}
			}
			while(flag!=0&&stop>0){
				if(f[stop].equals("+"))
					num[ntop-1] = num[ntop].add(num[ntop-1]);
				else if(f[stop].equals("*"))
					num[ntop-1] = num[ntop].multiply(num[ntop-1]);
				stop--;
			}
			if(flag == 0)
				System.out.println("Case "+k+": "+"Invalid Expression!");
			else
				System.out.println("Case "+k+": "+num[1]);
		}
	}
}

的值必須是大一1的,這樣才能夠說明前邊有加號存在!

發佈了76 篇原創文章 · 獲贊 4 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章