java2的7次方怎么表示_2的十万次幂怎么求?用Java做

再一次修正了下代码,测试了下大于10的数字也可以正常执行了

public class PowerTest {

public int[] power(int base, int index) {

int[] end = new int[] { 1 };

for (int i = 0; i < index; i++) {

int carry = 0;

for (int j = 0; j < end.length; j++) {

if (j == end.length - 1) {

if ((end[j] * base + carry) / 10 > 0) {

int tmp1 = end[j];

end[j] = (end[j] * base + carry) % 10;

int[] expansion = new int[j + 2];

System.arraycopy(end, 0, expansion, 0, end.length);

expansion[j + 1] = (tmp1 * base + carry) / 10;

end = expansion;

} else {

end[j] = end[j] * base + carry;

}

break;

}

int tmp = end[j];

end[j] = (end[j] * base + carry) % 10 >= 0 ? ((end[j] * base + carry) % 10) : (end[j] * base + carry);

carry = (tmp * base + carry) / 10;

}

}

return end;

}

@Test

public void test() {

int[] a = power(12, 10);

System.out.println(a.length);

StringBuffer sb = new StringBuffer(Arrays.toString(a));

System.out.println(sb.reverse().substring(1, sb.length() - 1));

}

}

应评论的要求补充一点内容

昨天夜里最原始的想法是利用2进制乘法移位的原理来完成楼主的这个需求,但是确实如评论所说会有精度上的问题

所以结合了@Carson的回复和自己的想法,写了一段代码(如下)。

代码的主要思路是,传入需要计算幂的数字,以及幂的次数(测试过程中只保证了10以内数字的n次幂,大于10的数字暂时还没测试)。计算的过程是模拟人类手工乘法计算的原理,讲乘数写入到数组中,然后逐位进行乘法,每一位大于10的时候产生进位,需要注意的是,在乘到最后一位时,如果发现要进位,那么需要做特殊处理,因为原有的数组长度不够了,因此引用了一个新数组,长度为原有的数组+1,这样可以解决最后一位进位的问题。

到这里主要的计算逻辑基本结束了,但是由于我写的算法是正向的,所以会导致最后的结果排列是倒序的,类似2^10次幂=1024,我的算法结果则会是4201,所以在测试类中做了一步字符串转换,并倒置了一下结果,以保证结果可以正常查看。

楼下的建议是正解,我昨天半夜里的想法确实不靠谱,晚点补个代码出来吧

代码补上。。。简单测了下,应该没问题

public class PowerTest {

public int[] power(int base, int index) {

int[] end = new int[] { 1 };

for (int i = 0; i < index; i++) {

int carry = 0;

for (int j = 0; j < end.length; j++) {

if (j == end.length - 1) {

if (end[j] * base + carry - 10 >= 0) {

end[j] = end[j] * base + carry - 10;

int[] expansion = new int[j + 2];

System.arraycopy(end, 0, expansion, 0, end.length);

expansion[j + 1] = 1;

end = expansion;

} else {

end[j] = end[j] * base + carry;

}

break;

}

int tmp = end[j];

end[j] = end[j] * base + carry - 10 >= 0 ? (end[j] * base + carry - 10) : (end[j] * base + carry);

carry = tmp * base + carry - 10 >= 0 ? 1 : 0;

}

}

return end;

}

@Test

public void test() {

int[] a = power(2, 20);

StringBuffer sb = new StringBuffer(Arrays.toString(a));

System.out.println(sb.reverse().substring(1, sb.length() - 1));

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值