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的,这样才能够说明前边有加号存在!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值