大數相乘(浮點數)實現

少喝闊落發表於2020-10-07

1 首先判定字串輸入是否合格(是否含有其他非法字元)

2 去掉字串多餘的0

3 提取小數點位置,吧小數點後面有幾位記錄下來,最後結果中確定結果含有幾位小數點,然後在加上(結果小數點的位數=兩個字串小數點後位數相加)

4 用字串實現大數相乘(去掉小數點),對結果進行復原(在合理位置加上小數點),

5去掉多餘的0

public static void main(String[] srgs) {
		new Decimal().Resolve();
	}
	public void Resolve(){
		String d1,d2;
		int floatnum1=0;
		int floatnum2=0;
		d1=Input();
		d2=Input();	
		//去0
		d1=RemoveZeroBegin(d1);
		d1=RemoveZeroEnd(d1);
		d2=RemoveZeroBegin(d2);
		d2=RemoveZeroEnd(d2);
		String[] decimal1=d1.split(",");		
		String[] decimal2=d2.split(",");
		//去小數點
		if(decimal1.length>1)
		{
			 floatnum1=decimal1[1].length();
			 d1=decimal1[0]+decimal1[1];
		}
		if(decimal2.length>1)
		{
			d2=decimal2[0]+decimal2[1];
			floatnum2=decimal2[1].length();
		}
		//相乘
		String sbString = Multiply(d1, d2);
		StringBuilder sb=new StringBuilder(sbString);
		//復原小數點
		if(floatnum1+floatnum2!=0)
		{
			sb.insert(sbString.length()-floatnum1-floatnum2, ',');
		}
		sbString=sb.toString();
		//繼續去0
		sbString=RemoveZeroBegin(sbString);
		sbString=RemoveZeroEnd(sbString);
		System.out.println(sbString);
		
	}
	
	@SuppressWarnings("resource")
	public String Input() {
		Scanner input=new Scanner(System.in);
		return input.next();
	}

	String Multiply(String s1,String s2) {
		int len1=s1.length();
		int len2=s2.length();
		int[] res=new int[len1+len2];
		for(int i=0;i<res.length;i++) {
			res[i]=0;
		}
	
		for(int i=s1.length()-1;i>=0;i--) {
			
			for(int j=s2.length()-1;j>=0;j--) {
				
				res[ len1-1-i + len2-1-j] += (s1.charAt(i)-'0') * (s2.charAt(j)-'0');					
			}			
		}
		String sb="";
		for(int i=0;i<res.length-1;i++) {
			res[i+1] += res[i]/10;
			res[i]%=10;
			sb+= res[i];
		}
		sb+=res[res.length-1];
		sb = Reverse(sb);
		return sb;
	}

	String  Reverse(String str){
		 char[] chars = str.toCharArray();
		 String reverse = "";
		 for (int i = chars.length - 1; i >= 0; i--) {
		     reverse += chars[i];
		 }
		 return reverse;
	}
	
	String RemoveZeroBegin(String str) {
		String s="";
		int i=0;
		while(str.charAt(i)=='0' && i<str.length() && str.charAt(i+1)!=',') {
			i++;
		}
		s=str.substring(i, str.length());
		return s;
	}
	
	String RemoveZeroEnd(String str) {
		String s="";
		int i=str.length()-1;
		while(str.charAt(i)=='0') {
			i--;
			if(str.charAt(i)==',') {
				i--;
				break;
			}
		}
		s=str.substring(0, i+1);
		return s;
	}

題目中的小數點我用的是 “,” 因為我用了java的split函式,開啟原始碼發現在split函式裡面吧 “.” 遮蔽了所以暫時用逗號代替一下,如圖:

 if (((regex.value.length == 1 &&
             ".$|()[{^?*+\\".indexOf(ch = regex.charAt(0)) == -1) ||
             (regex.length() == 2 &&
              regex.charAt(0) == '\\' &&
              (((ch = regex.charAt(1))-'0')|('9'-ch)) < 0 &&
              ((ch-'a')|('z'-ch)) < 0 &&
              ((ch-'A')|('Z'-ch)) < 0)) &&
            (ch < Character.MIN_HIGH_SURROGATE ||
             ch > Character.MAX_LOW_SURROGATE))

而且因為我沒學過java,java實驗要用java來寫,所以java程式碼寫的很爛。。。。。。。

相關文章