當前位置:編程學習大全網 - 編程語言 - 有些難度的java編程題

有些難度的java編程題

StringBuilder 結合了字符數組和字符串的好些優點,所以實現大整數類的時候如果利用 StringBuilder 可以省掉不少功夫,比如:

import java.util.*;

class SPBI {// SimplePositiveBigInteger 的縮略

public static void main(String[] args) {

try {

System.out.println("輸入兩個 30 位數以內的正整數和壹個符號('+' 或 '*'):");

Scanner scn = new Scanner(System.in);

SPBI a = new SPBI(scn.nextLine().trim()),

b = new SPBI(scn.nextLine().trim());

String operator = scn.nextLine().trim();

if (a.toString().length() > 30 || b.toString().length() > 30)

throw new Exception("至少有壹個整數超過 30 位數");

if ( ! operator.matches("\\+|\\*"))

throw new Exception("此程序不支持的符號:" + operator);

System.out.println(

"\n\n" +

a.toStringWithDigitGrouping() + operator + "\n" +

b.toStringWithDigitGrouping() + "\n" +

"------------------------------ \n");

if (operator.equals("+"))

System.out.println(a.add(b).toStringWithDigitGrouping());

else

System.out.println(a.multiply(b).toStringWithDigitGrouping());

} catch (Exception ex) {

System.out.println("錯誤:" + ex.getMessage() + "。請重試。");

}

}

// 此 SBPI 所代表的整數(註:個位數在左端)

private StringBuilder reversedDigits;

// 唯壹的構造器

public SPBI(String spbi) {

if ( ! spbi.matches("\\d+"))

throw new IllegalArgumentException(spbi + " 不符合正整數格式");

reversedDigits = new StringBuilder(spbi).reverse();

normalize();

}

// 去掉這個 SPBI 中多余的前導零(全在 reversedDigits 的右端)

private void normalize() {

reversedDigits = new StringBuilder(reversedDigits.toString().replaceAll("(?<!^)0+$", ""));

}

public String toString() {

return "" + new StringBuilder(reversedDigits).reverse();

}

// 除了在返回的字符串中加入了千位分組符外,跟 toString() 沒差別

public String toStringWithDigitGrouping() {

return "" + new StringBuilder(reversedDigits.toString().replaceAll(".{3}(?!$)", "$0,")).reverse();

}

// 加法操作(等於 this += that 然後返回 this)

public SPBI add(SPBI that) {

int maxLength = Math.max(reversedDigits.length(), that.reversedDigits.length());

reversedDigits.setLength(maxLength);// 可能造成 reversedDigits 的右端被填入 '\0'

int carry = 0;

for (int i = 0; i < reversedDigits.length(); i++) {

int digitOfThis = reversedDigits.charAt(i) != '\0' ? reversedDigits.charAt(i) - '0' : 0,

digitOfThat = i < that.reversedDigits.length() ? that.reversedDigits.charAt(i) - '0' : 0,

sum?= digitOfThis + digitOfThat + carry;

carry = sum > 9 ? 1 : 0;

reversedDigits.setCharAt(i, (char) (sum % 10 + '0'));

}

reversedDigits.append(carry);

normalize();

return this;

}

// 乘法操作(等於 this *= that 然後返回 this)

public SPBI multiply(SPBI that) {

SPBI multiplesOfTenOfOriginalThis = new SPBI(toString());

reversedDigits = new StringBuilder("0");// this 歸零

for (int iThat = 0; iThat < that.reversedDigits.length(); iThat++) {

for (int addCount = 0; addCount < that.reversedDigits.charAt(iThat) - '0'; addCount++)

add(multiplesOfTenOfOriginalThis);

multiplesOfTenOfOriginalThis.reversedDigits.insert(0, 0);// 乘 10

}

return this;

}

}

  • 上一篇:哪個職業既要模擬黑客攻擊又要防禦
  • 下一篇:信息安全專業到底學什麽?
  • copyright 2024編程學習大全網