首先扯点别的:今天上海下雨了,不大,空气很清新,温度也很舒适,今晚可以睡个好觉了。
今天总结一些2的n次幂的算法实现,只讨论n>=0的情况。
如果n比较小的话,可以这样实现。
private static int calculate(int n) {
if (n == 0)
return 1;
return 2 * calculate(n - 1);
}
但是当n很大的时候,结果会超出int类型(能表示的最大的数为 2 31 − 1 {2^{31}}-1 231−1)或者long类型所能表示的最大的数( 2 63 − 1 {2^{63}}-1 263−1)的时候,就会出问题,接下来就是讲述在n很大的情况下如何计算2的n次幂。
核心思想就是使用一个字符串str来表示一个整数进行计算和存储。
起始条件是: 2 0 {2^{0}} 20=1,我们用字符串表示 str=“1”。
当n大于0的时候,我们需要从str=“1”开始,将字符串所代表的整出乘以2,总共需要乘以n次。
举个例子,计算
2
3
{2^{3}}
23,str=“1”,我们总共需要乘以3次。
1*2*2*2=8
计算 2 4 {2^{4}} 24,str=“1”,我们总共需要乘以4次。
1*2*2*2*2=16
然后我们需要明确的就是如何将字符串表示的整数和2相乘,并将结果转化为字符串。细节就不说了,看下面的具体代码吧。
完整的算法如下
public static void main(String args[]) {
String result = expString(2, 6);
System.out.println(result);
}
/**
* @param bottom 底数
* @param var 指数
* @return
*/
private static String expString(Integer bottom, Integer var) {
int i = 0;
String str = "1";
while (i < var) {
str = multiString(bottom, str);
i++;
}
return str;
}
/**
* @param bottom 底数
* @param str 指数
* @return
*/
private static String multiString(Integer bottom, String str) {
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 * bottom;
//为什么是i+1呢?,因为最后可能会有进位
result[i + 1] = ((char) ((all % 10 + temp) % 10 + 48));
temp = (all + temp) / 10;
}
if (temp != 0) {
//最后如果有进位
result[0] = (char) (temp + 48);
}
//去掉不需要的0
return String.valueOf(result).replaceAll("\u0000", "");
}
结尾:感觉自己叙述的不是很清楚,如果感觉有疑问,可以把代码拷贝下来,自己debug一下,一步一步分析理解。