2的n次幂的Java实现

来源:互联网 发布:java语言发展历史 编辑:程序博客网 时间:2024/05/18 22:12

首先扯点别的:今天上海下雨了,不大,空气很清新,温度也很舒适,今晚可以睡个好觉了。
今天总结一些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一下,一步一步分析理解。

原创粉丝点击