




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、package com.liheng.algorithm;import java.util.Scanner;import java.util.regex.Matcher;import java.util.regex.Pattern/* * 大整數(shù)乘法 * * */public class BigIntMultiply /規(guī)模只要在這個(gè)范圍內(nèi)就可以直接計(jì)算了 private final static int SIZE = 4; / 此方法要保證入?yún)en為X、Y的長(zhǎng)度最大值 private static String bigIntMultiply(String X, String Y, int
2、len) / 最終返回結(jié)果 String SA_B,SD_C; String str = "" int flag=0; / 補(bǔ)齊X、Y,使之長(zhǎng)度相同 X = formatNumber(X, len); Y = formatNumber(Y, len); / 少于4位數(shù),可直接計(jì)算 if (len <= SIZE) return "" + (Integer.parseInt(X) * Integer.parseInt(Y); / 將X、Y分別對(duì)半分成兩部分 int len1 = len / 2; int len2 = len - len1; Stri
3、ng A = X.substring(0, len1); String B = X.substring(len1); String C = Y.substring(0, len1); String D = Y.substring(len1); / 兩字符串長(zhǎng)度要相同 int lenM = Math.max(A.length(), B.length(); String A1 = formatNumber(A, lenM); String B1 = formatNumber(B, lenM); int a=Integer.parseInt(A1.substring(0, 1); int b= In
4、teger.parseInt(B1.substring(0, 1); if(a>b) SA_B=dudcting(A1,B1); else SA_B = dudcting(B1,A1); flag+; lenM = Math.max(A.length(), B.length(); String C1 = formatNumber(C, lenM); String D1 = formatNumber(D, lenM); int c=Integer.parseInt(C1.substring(0, 1); int d= Integer.parseInt(D1.substring(0, 1);
5、 if(d>c) SD_C=dudcting(D1,C1); else SD_C = dudcting(C1,D1); flag+; lenM=Math.max(SA_B.length(), SD_C.length(); String ABDC="" if(flag!=1) ABDC = bigIntMultiply(SA_B, SD_C, lenM); else ABDC = bigIntMultiply(SA_B, SD_C, lenM); String AC = bigIntMultiply(A, C, len1); String BD = bigIntMult
6、iply(B, D, len2); / 處理BD,得到原位及進(jìn)位 String sBD = dealString(BD, len2); / 處理AD+BC的和 String ADBC = addition(AC, BD); String ABCD="" lenM = Math.max(ABDC.length(), ADBC.length(); if(flag=1) String ABDC1 = formatNumber(ABDC, lenM); String ADBC1 = formatNumber(ADBC, lenM); int a1=Integer.parseInt(
7、ABDC1.substring(0, 1); int b1= Integer.parseInt(ADBC1.substring(0, 1); ABCD = dudcting(ADBC1,ABDC1); else ABCD = addition(ABDC,ADBC); flag=0; / 加上BD的進(jìn)位 if (!"0".equals(sBD1) ABCD = addition(ABCD, sBD1); / 得到ADBC的進(jìn)位 lenM = Math.max(len1, len2); String sABCD = dealString(ABCD, lenM); / AC加上A
8、DBC的進(jìn)位 AC = addition(AC, sABCD1); / 最終結(jié)果 str = AC + sABCD0 + sBD0; return str; / 兩個(gè)數(shù)字串按位加 private static String addition(String ad, String bc) / 返回的結(jié)果 String str = "" / 兩字符串長(zhǎng)度要相同 int lenM = Math.max(ad.length(), bc.length(); ad = formatNumber(ad, lenM); bc = formatNumber(bc, lenM); / 按位加,進(jìn)
9、位存儲(chǔ)在temp中 int flag = 0; / 從后往前按位求和 for (int i = lenM - 1; i >= 0; i-) int t = flag + Integer.parseInt(ad.substring(i, i + 1) + Integer.parseInt(bc.substring(i, i + 1); / 如果結(jié)果超過9,則進(jìn)位當(dāng)前位只保留個(gè)位數(shù) if (t > 9) flag = 1; t = t - 10; else flag = 0; / 拼接結(jié)果字符串 str = "" + t + str; if (flag != 0)
10、str = "" + flag + str; return str; / 兩個(gè)數(shù)字串按位減 private static String dudcting(String ad, String bc) / 返回的結(jié)果 String str = "" / 按位加,進(jìn)位存儲(chǔ)在temp中 int flag = 0; / 從后往前按位求和 for (int i = ad.length() - 1; i >= 0; i-) int t =flag+Integer.parseInt(ad.substring(i, i + 1)-Integer.parseInt(b
11、c.substring(i, i + 1); / 如果結(jié)果超過9,則進(jìn)位當(dāng)前位只保留個(gè)位數(shù) if (t <0) flag = -1; t = t+10; else flag = 0; / 拼接結(jié)果字符串 str = "" + t + str; if (flag != 0) str = "" + flag + str; return str; / 處理數(shù)字串,分離出進(jìn)位; / String數(shù)組第一個(gè)為原位數(shù)字,第二個(gè)為進(jìn)位 private static String dealString(String ac, int len1) String str
12、 = ac, "0" if (len1 < ac.length() int t = ac.length() - len1; str0 = ac.substring(t); str1 = ac.substring(0, t); else / 要保證結(jié)果的length與入?yún)⒌膌en一致,少于則高位補(bǔ)0 String result = str0; for (int i = result.length(); i < len1; i+) result = "0" + result; str0 = result; return str; / 乘數(shù)、被乘數(shù)
13、位數(shù)對(duì)齊 private static String formatNumber(String x, int len) while (len > x.length() x = "0" + x; return x; /測(cè)試樁 public static void main(String args) / 正則表達(dá)式:不以0開頭的數(shù)字串 String pat = "1-9d*$" Pattern p = Ppile(pat); / 獲得乘數(shù)A System.out.println("請(qǐng)輸入乘數(shù)A(不以0開頭的正整數(shù)):"); Scanner sc = new Scanner(System.in); String A = sc.nextLine(); Matcher m = p.matcher(A); if (!m.matches() System.out.println("數(shù)字不合法!"); return; / 獲得乘數(shù)B System.out.println("請(qǐng)輸入乘數(shù)B(不以0開頭的正整數(shù)):"); sc = new Scanner(System.in); String B
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 加盟店物料采購(gòu)合同范例
- 基于居民幸福感的老舊小區(qū)交通環(huán)境評(píng)價(jià)研究
- 兒買工程合同范例
- 主播帶貨兼職合同范本
- 基礎(chǔ)回填施工方案
- 分割房屋合同范例
- 遼寧花卉溫室施工方案
- 住宅監(jiān)控合同范例
- 加工工廠客戶合同范例
- 書法教師合同范例
- 2022年江西科技職業(yè)學(xué)院?jiǎn)握芯C合素質(zhì)考試筆試試題及答案解析
- 季節(jié)性施工專項(xiàng)施工方案(常用)
- 傷口(壓瘡)的評(píng)估與記錄
- 煤礦機(jī)電運(yùn)輸類臺(tái)賬(各種記錄匯編)
- 風(fēng)電場(chǎng)道路及平臺(tái)施工組織方案
- 風(fēng)險(xiǎn)分級(jí)管控74411ppt課件(PPT 146頁)
- 三八女神節(jié)活動(dòng)策劃PPT課件
- 畢業(yè)設(shè)計(jì)(論文)3000t自由鍛液壓機(jī)本體設(shè)計(jì)
- 風(fēng)力發(fā)電機(jī)組PLC系統(tǒng)
- Q∕GDW 12131-2021 干擾源用戶接入電網(wǎng)電能質(zhì)量評(píng)估技術(shù)規(guī)范
- T∕CAEPI 32-2021 全尾砂膏體充填關(guān)鍵設(shè)備技術(shù)要求
評(píng)論
0/150
提交評(píng)論