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型別(能表示的最大的數為
核心思想就是使用一個字串來表示一個整數進行計算和儲存。
首先起始點是
當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一下,一步一步分析理解。