標籤:
問題描述:輸入一個由數字組成的字串,把它轉換成整數並輸出,要求不能使用系統提供的轉換函式或方法。
例如:輸入字串"123",輸出整數123。
許多程式設計語言提供了字串和各種類型的轉換的函數或方法,但是我們也要會自己編寫相應的轉換方法或函數,其他類型的轉換與此類似。
這裡我以字串轉換為整型為例,進行介紹。
分析:基本思路是從左至右掃描字串,把之前得到的數字乘以10,再加上當前字元表示的數字。但是在轉換的過程中,需要注意幾個問題。
1、Null 字元串輸入:輸入的是Null 字元串,對Null 字元串進行轉換,程式可能會崩潰,因此需要先判斷字串是否為空白。我們約定,當字串為空白時,返回0.
2、正負符號:字串可能不僅包含數字,還有可能是以‘+‘或‘-‘開頭表示的正負整數字串,因此需要對第一個字元進行特殊處理。
3、非法字元:輸入的字串中可能含有不是數字,也不是"+"或者"-"這樣的字元。因此,我們約定,每當碰到這些非法的字元時,停止轉換,返回0。
4、整型溢出:輸入的數字是以字串的形式輸入,因此輸入一個很長的字串將可能導致溢出。因此要考慮邊界問題。 我們約定:
當轉化的值大於整型的最大值時,返回整型的最大值;
當轉換的值小於整型的最小值時,返回整型的最小值;
上述四個問題中,最難處理的是溢出問題,因此,對於溢出,有兩種方法去解決。
方法一:定義一個更大範圍的變數,作為轉換結果,並將轉換結果與整型的最大值和最小值進行比較,判斷是否溢出。此種方法比較簡單,我不再寫程式實現。
方法二:讀者可以結合下面的代碼理解,在轉換某位字元之前,
對於正整數,先比較之前轉換的結果(本代碼中為strint)和max / 10的大小,即:
若strint > max / 10,那麼說明最後一步轉換時,strint *10必定大於max,此時直接返回max。
若strint == max / 10 ,那麼比較該位元字 c 和 max % 10的大小,如果c > max % 10,直接返回max。
對於負整數,同樣先比較之前轉換的結果(本代碼中為strint)和min / 10的大小,即:
若-1*strint < min / 10,那麼說明最後一步轉換時,-1*strint *10必定小於min,此時直接返回min。
若-1*strint == min / 10 ,那麼比較該位元字 -1*c 和 min % 10的大小,如果 -1*c < min % 10,直接返回min。
由於第二種方法比較麻煩,這裡我給出第二種方法的Java程式碼,代碼寫法都比較通用,讀者可以很容易的轉換為其他語言實現。
需要注意,Java中整型佔4個位元組,不同的程式設計語言可能不太一樣,讀者需要結合自己的程式設計語言進行適當的調整。
綜上所述:完整的Java代碼如下:
1 import java.util.*; 2 class Test { 3 public static int StringToInt(String str){ 4 int n=str.length(); 5 int strint=0; 6 int sign=1; //符號標誌 7 if(n==0)return 0; //如果字串為空白,則返回 0 8 9 if(str.charAt(0)==‘+‘) //預先處理第一個字元,因為第一個字元可能帶有符號位10 sign=1;11 else if(str.charAt(0)==‘-‘)12 sign=-1;13 else if(str.charAt(0)>=‘0‘&& str.charAt(0)<=‘9‘)14 strint=str.charAt(0)-‘0‘;15 else return strint;16 17 int max=(int)(Math.pow(2,31)-1); //整數為正數的最大值 ,由於Java中整形佔4個位元組,不同的語言可能不太一樣,讀者需要自己調整18 int min=(int)Math.pow(-2,31); //整數為負數的最小值19 for(int i=1;i<n;i++) //依次處理後續字元20 { 21 if(str.charAt(i)<‘0‘ || str.charAt(i)>‘9‘)return 0; //如果後續字元中出現非數字字元,則直接返回 022 int c=str.charAt(i)-‘0‘;23 if(sign==1 && (strint > max / 10 || (strint == max / 10 && c > max % 10))) //最大值越界處理24 return max;25 if(sign==-1 && (-1*strint <min/10 || (-1*strint== min / 10 && -1*c < min % 10))) //最小值越界處理26 return min;27 28 strint=strint*10+c; //正常處理字串每一位 的字元 29 }30 return sign*strint; //正常返回結果31 }32 }33 34 public class Main {35 public static void main(String[] args) {36 String str=new String("-21474836"); //讀者可以根據需要進行各種測試,這裡不再舉例37 System.out.println("str="+str);38 System.out.println("轉換為整型後為:"+Test.StringToInt(str));39 40 }41 42 }View Code
輸出結果為:
str=-21474836
轉換為整型後為:-21474836
讀者可以自己再舉例進行驗證。
這個題目給出了將字串轉換為整數的方法和需要注意的幾個問題,實際編程中,還會有其他類似的轉換問題,比如將字串轉換為浮點型(還要考慮小數點問題),等等。
但是這個題目給了我們一種轉換的思路,還有需要注意的問題,總之,針對每個類型,要仔細考慮每個類型的特殊情況。關於其他類型的轉換,本文不再祥述,讀者可以照著這種思路進行考慮編程即可。
字串轉換成整數