1. 程式人生 > >2的n次冪的Java實現

2的n次冪的Java實現

首先扯點別的:今天上海下雨了,不大,空氣很清新,溫度也很舒適,今晚可以睡個好覺了。
今天總結一些2的n次冪的演算法實現,只討論n>=0的情況。

如果n比較小的話,可以這樣實現。

private static int calculate(int n) {
        if (n == 0)
            return 1;
        return 2 * calculate(n - 1);
    }

但是當n很大的時候,結果會超出int型別(能表示的最大的數為2321)或者long型別所能表示的最大的數(2641)的時候,就會出問題,接下來就是講述在n很大的情況下如何計算2的n次冪。

核心思想就是使用一個字串來表示一個整數進行計算和儲存。

首先起始點是20結果是1,我們用字串表示 str=“1”。

當n不為0的時候,把str=“1”的每一位都轉化成一個int型別的整數(從i=str.length()-1 位開始,i>=0位結束),然後和2相乘,把每位的計算結果轉化成字串累加,就可以得到最終的結果。

n=0 ;str0=”1”; 迴圈的初始值。

n=1 ; str0=”1”,字串長度一位,轉化成1*2 =2,結果重新賦值給str1=“2”;

n=2 ; str1=”2”,字串長度一位,轉化成2*2 =4,結果重新賦值給str2=“4”;

n=3 ; str2=”4”,字串長度一位,轉化成4*2 =8,結果重新賦值給str3=“8”;

n=4 ; str3=”8”,字串長度一位,轉化成8*2 =16,結果重新賦值給str4=“16”;

n=5 ; str4=”16”,字串長度2位,從字串的i=str.length()-1 ,即i=1位開始,轉化成整數和2相乘 6*2=12,要進位1,結果str5的最後一位是“2”;現在i向前推,i=0;1*2=2,再加上剛才從低位進位的1,結果是3,所以str5的第0位就是“3”,最後str5=“32”;

完整的演算法如下

public static void main(String args[]) throws Exception {
        String result = expString(2
, 6); System.out.println(result); } private static String expString(Integer bottom, Integer var) { int i = 0; String str = "1"; while (i < var) { str = multiString(str, bottom); i++; } return str; } private static String multiString(String str, Integer var) { char[] c = str.toCharArray(); //結果可能和原陣列一樣長或者比原陣列長度長1, 2的3次冪是8,2的4次冪就是16了 char[] result = new char[c.length + 1]; //temp用來表示是否有進位 int temp = 0; for (int i = c.length - 1; i >= 0; i--) { //48 是 0對應的ASCII碼 int j = (int) c[i] - 48; int all = j * var; result[i + 1] = ((char) ((all % 10 + temp) % 10 + 48)); temp = (all + temp) / 10; } if (temp != 0) { //如果有進位 result[0] = (char) (temp + 48); } System.out.println(String.valueOf(result)); //去掉不需要的0 return String.valueOf(result).replaceAll("\u0000", ""); }

結尾:感覺自己敘述的不是很清楚,如果感覺有疑問,可以把程式碼拷貝下來,自己debug一下,一步一步分析理解。