POJ 1001(高精度乘法 java的2种解法)

方法1:

import java.math.BigDecimal;
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()){
			String d = sc.next();
			int z = sc.nextInt();
			BigDecimal bd = new BigDecimal(d);
			BigDecimal re = new BigDecimal("1");
			for(int i = 0; i < z; i++){
				re = re.multiply(bd);
			}
			String result = re.stripTrailingZeros().toPlainString();
			if(result.startsWith("0.")){
				result = result.substring(1);
			}
			System.out.println(result);
		}
	}
}

方法2:

import java.util.Scanner;
public class Main {
	static class BigDecimal{
		//最大整型46340
		private String src;
		private int dotPos;
		private int afterdot;
		public BigDecimal(String d) {
			// TODO Auto-generated constructor stub
			src = d;
			Double.parseDouble(src);//检查数据是否合法
			stripTrailingZeros();
			
			dotPos = src.indexOf('.');//如果没有就返回-1
			if(dotPos == -1)
				afterdot = 0;
			else
				afterdot = src.length() - 1 - dotPos;
		}

		public BigDecimal(BigDecimal bd) {
			this(bd.src);
		}

		@Override
		public String toString() {
			return src;
		}
		private String[] splitSrc(){
			//数据: 123 4567 8888 9999 
			//下标: 3   2    1    0
			String isrc = delDot(src);
			int srcLength = isrc.length();
			int arrayLength = srcLength % 4 == 0 ? srcLength / 4: srcLength/4 + 1;

			String result[] = new String[arrayLength];
			for(int i = 0; i < result.length; i++){
				int mark = srcLength - i * 4;
				result[i] = isrc.substring(mark - 4 < 0 ? 0: mark - 4, mark);//坑爹的substring();
			}
			return result;
		}
		
		private int getAfterDot (){//小数点后面有多少位
			return afterdot;
		}
		
		private String delDot(String src){//去掉src中的小数点
			String res = "" + src;
			if(res.contains("."))
				res = res.replace(".", "");//坑爹的replace()
			return res;
		}

		private void correctArray(String rArray[], int currentBit){//处理进位
			String sr = rArray[currentBit];
			int currentInt = Integer.parseInt(sr);
			String currentString = String.valueOf(currentInt);
			int l = currentString.length();
			if(currentInt >= 10000){//
				rArray[currentBit] = sr.substring(l - 4, l);
				int carry = Integer.parseInt(sr.substring(0, l - 4));
				int upBitValue = Integer.parseInt(rArray[currentBit + 1]);
				rArray[currentBit + 1] = "" + (carry + upBitValue);
			}else if(currentInt < 1000){//增加前缀0
				int n = 4 - l;
				StringBuilder sb = new StringBuilder();
				for(int i = 0; i < n; i++){
					sb.append("0");
				}
				rArray[currentBit] = sb.append(sr).toString();
			}
		}
		
		public BigDecimal multiply(BigDecimal bd) {
			String srcs[] = splitSrc();
			String bds[] = bd.splitSrc();
			int resultDotPos = getAfterDot() + bd.getAfterDot(); 
			int resultBitTotal = bds.length + srcs.length;
			String result[] = new String[resultBitTotal];//当前结果。初始化为null
			for(int fr = 0; fr < resultBitTotal; fr++){
				result[fr] = "0";
			}
			int currentBit = 0;//当前计算的结果应该放在哪个结果位
			for(int i = 0; i < srcs.length; i++){
				int srcInner = Integer.parseInt(srcs[i]);
				for(int j = 0; j < bds.length; j++){
					currentBit = i + j;//当前结果应该放在第几结果位
					int bdInner = Integer.parseInt(bds[j]);
					int cuIntResult = srcInner * bdInner;//当前计算结果。
					
					int existValue = Integer.parseInt(result[currentBit]);//已经存在的结果

					int cr = existValue + cuIntResult;//结果合并
					result[currentBit] = "" + cr;//合并的结果的String值
					
					correctArray(result, currentBit);//矫正result值
				}
			}
			StringBuilder sb = new StringBuilder();
			for(int m = resultBitTotal - 1; m >= 0; m--){
				sb.append(result[m]);
			}
			int prezeronum = resultDotPos - sb.length();
			for(int xx = 0; xx < prezeronum; xx++){//插入前缀0
				sb.insert(0, "0");
			}
			if(resultDotPos != 0){
				sb.insert(sb.length() - resultDotPos, ".");//插入小数点
			}
			return new BigDecimal(sb.toString()).stripTrailingZeros();
		}

		public BigDecimal stripTrailingZeros() {
			while((src.contains(".") && src.endsWith("0")) || src.endsWith(".")){//去除小数的后缀0,后缀.
				src = src.substring(0, src.length() - 1);
			}
			while(src.startsWith("0") && !src.equals("0")){//去除前缀0
				src = src.substring(1, src.length());
			}
			return this;
		}		
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()){
			String d = sc.next();
			int z = sc.nextInt();
			BigDecimal bd = new BigDecimal(d);
			BigDecimal re = new BigDecimal("1");
			for(int i = 0; i < z; i++){
				re = re.multiply(bd);
			}
			String result = re.stripTrailingZeros().toString();
			if(result.startsWith("0.")){
				result = result.substring(1);
			}
			System.out.println(result);
		}
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值