1. 程式人生 > >兩個超大整數相加

兩個超大整數相加

用字串處理數值運算

總體思想:按照小學算術運算計算,按位運算從陣列最高位,一個個的取出來相加(當然的先把單個字元轉換為整型),記住進位,迴圈計算
需要做的事情:
(1)判斷輸入的字串是否為數字(特別要考慮小數點,如果做除法,被除數不能為0)
(2)比較2個字串長度大小,對長度小的字串左邊補0
面試題1:如果系統要使用超大整數(超過long的範圍),請你設計一個數據結構來儲存這種超大型數字以及設計一種演算法來實現超大整數的加法運算 。
分析:
1、判斷輸入的字串是否為數字
短字串左邊補0
把兩個的長度做比較,在左面補0,使之與較長的字串一樣長
2、轉換為整數按位運算
按位運算從陣列最高位,一個個數的取出來相加(當然的先把單個字元轉換為整型)
5、設定進位
result=a+b+jw兩個數相加及加上進位
1)if>10,並且這不是最左邊一個字元相加,相加結果等於result=result-10,並把進位設為1;
2)如果沒有大於10,就把進位設為0

String doAdd(String a,String b)
{
String str="";
int lenA=a.length();
int lenB=b.length();
int maxLen=(lenA>lenB) ? lenA : lenB;
int minLen=(lenA<lenB) ? lenA : lenB;
String strTmp="";

for(int i=maxLen-minLen;i>0;i--)
strTmp+="0";

//把長度調整到相同
if(maxLen==lenA)
b=strTmp+b;
else
a=strTmp+a;

int
JW=0;//進位 for(int i=maxLen-1;i>=0;i--) { int tempA=Integer.parseInt(String.valueOf(a.charAt(i))); //把a的第i個取出,類似於陣列的挨個查詢。 int tempB=Integer.parseInt(String.valueOf(b.charAt(i))); int temp; if(tempA+tempB+JW>=10 && i!=0) { temp=tempA+tempB+JW-10; JW=1; } //end if else { temp=tempA+tempB+JW; JW=0; } //end else
str=String.valueOf(temp)+str; }//end for return str; } //doAdd()

String.valueOf基本使用

原文
1. 由 基本資料型態轉換成 String
String 類別中已經提供了將基本資料型態轉換成 String 的 static 方法
也就是 String.valueOf() 這個引數多載的方法
有下列幾種
String.valueOf(boolean b) : 將 boolean 變數 b 轉換成字串
String.valueOf(char c) : 將 char 變數 c 轉換成字串
String.valueOf(char[] data) : 將 char 陣列 data 轉換成字串
String.valueOf(char[] data, int offset, int count) :
將 char 陣列 data 中 由 data[offset] 開始取 count 個元素 轉換成字串
String.valueOf(double d) : 將 double 變數 d 轉換成字串
String.valueOf(float f) : 將 float 變數 f 轉換成字串
String.valueOf(int i) : 將 int 變數 i 轉換成字串
String.valueOf(long l) : 將 long 變數 l 轉換成字串
String.valueOf(Object obj) : 將 obj 物件轉換成 字串, 等於 obj.toString()
用法如:
int i = 10;
String str = String.valueOf(i);
這時候 str 就會是 “10”
2. 由 String 轉換成 數字的基本資料型態
要將 String 轉換成基本資料型態轉
大多需要使用基本資料型態的包裝類別
比如說 String 轉換成 byte
可以使用 Byte.parseByte(String s)
這一類的方法如果無法將 s 分析 則會丟出 NumberFormatException
byte :
Byte.parseByte(String s) : 將 s 轉換成 byte
Byte.parseByte(String s, int radix) : 以 radix 為基底 將 s 轉換為 byte
比如說 Byte.parseByte(“11”, 16) 會得到 17
double :
Double.parseDouble(String s) : 將 s 轉換成 double
float :
Double.parseFloat(String s) : 將 s 轉換成 float
int :
Integer.parseInt(String s) : 將 s 轉換成 int
long :

Integer.parseInt()使用

原文
new Integer.valueof()返回的是Integer的物件。
Integer.parseInt() 返回的是一個int的值。
new Integer.valueof().intValue();返回的也是一個int的值。

parseInt
public static int parseInt(String s, int radix) throws NumberFormatException
以第二個引數所指定基數將字串引數分析為一個帶符號的整數。除了第一個字元可以用 ASCII 的減號 ‘-’ 來表示一個負值外,字串中的字元必須是指定基數的數(由 Character.digit 是否返回非負值決定)。返回作為結果的整數值。

引數:
s - 包含整數的 String 。
radix - 使用的進位制
返回值:
指定基數的字串引數所表示的整數。
丟擲: NumberFormatException
若該串不包含一個可分析的整數。
parseInt
public static int parseInt(String s) throws NumberFormatException
將字串引數作為帶符號十進位制整數來分析。除過第一個字元為 ASCII 字元中減號 ‘-’ 表示的負數,字串中的字元都必須是十進位制數。

引數:
s - 串。
返回值:
十進位制引數表示的整數。
丟擲: NumberFormatException
若該串不包含一個可分析的整數。
valueOf
public static Integer valueOf(String s, int radix) throws NumberFormatException
返回初始化為指定 String 值的新的 Integer 物件。若該 String 不能作為 int 分析,則丟擲異常。

引數:
s - 待分析的字串。
返回值:
新建立的 Integer ,將其以指定基數初始化為字串引數所表示的值。
丟擲: NumberFormatException
若 String不包含可分析的整數。
valueOf
public static Integer valueOf(String s) throws NumberFormatException
返回初始化為指定 String 值的新的 Integer 物件。若該 String 不能作為 int 分析,則丟擲異常。假設基數為 10 。

引數:
s - 待分析的字串。
返回值:
新建立的 Integer ,將其初始化為字串引數所表示的值。
丟擲: NumberFormatException
如果該串不包含一個可分析的整數。

static int parseInt(String s)
將字串引數作為有符號的十進位制整數進行分析。
static Integer valueOf(int i)
返回一個表示指定的 int 值的 Integer 例項。
static Integer valueOf(String s)
返回保持指定的 String 的值的 Integer 物件。
從返回值可以看出他們的區別 parseInt()返回的是基本型別int
而valueOf()返回的是包裝類Integer Integer是可以使用物件方法的 而int型別就不能和Object型別進行互相轉換
int zhuan=Integer.parseInt(chuan);
int zhuanyi=Integer.valueOf(chuan); 為什麼你的程式返回值都可以用int來接收呢? 因為Integer和int可以自動轉換
Integer i = 5; int k = i;像是這樣表示是沒有編譯錯誤的

例題:
設有下面兩個賦值語句:
a = Integer.parseInt(“123”);
b = Integer.valueOf(“123”).intValue();
下述說法正確的是( d )。
A、a是整數型別變數,b是整數類物件。
B、a是整數類物件,b是整數型別變數。
C、a和b都是整數類物件並且值相等。
D、a和b都是整數型別變數並且值相等。
詳細解析:
parseInt(String s )方法是類Integer的靜態方法,它的作用就是將形參 s 轉化為整數,比如:
Interger.parseInt(“1”)=1;
Integer.parseInt(“20”)=20;
Integer.parseInt(“324”)=324;
當然,s 表示的整數必須合法,不然是會拋異常的。
valueOf(String s )也是Integer類的靜態方法,它的作用是將形參 s 轉化為Integer物件,
什麼是Integer物件,Integer就是基本資料型別int型包裝類,就是將int包裝成一個類,這樣在很多場合下是必須的。如果理解不了,你就認為int是Integer的mini版,好用了很多,但也丟失了一些功能,好了,看程式碼:
Interger.valueOf(“123”)=Integer(123)
這時候Integer(123)就是整數123的物件表示形式,它再呼叫intValue()方法,就是將123的物件表示形式轉化為基本資料123
所以,選擇D