快速幂

本文介绍了一个使用Java实现的大数运算示例,通过BigInteger类求解3的10000001次方的问题。该算法采用了一种特殊的拆分策略来避免内存溢出,并逐步计算目标值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.math.BigInteger;
import java.util.ArrayList;

public class Main{
	static final long MAX=10000001;
	public static void main(String[] args) {
		//求3的10000001次方
		BigInteger nine=new BigInteger("9");
		int i=1;//当前次幂数
		int sum=2;//当前次幂值
		long mi=MAX;//当前剩余值
		ArrayList<Integer> al=new ArrayList<Integer>();//拆分的次幂数
		while(true) {
			if(sum>mi)
				break;
			sum*=2;
			i++;
		}//求最大的次幂数(循环初始值)
		while(true) {
			if(mi==0)
				break;//剩余值为零时
			if(sum>mi) {//如果当前次幂值超了剩余值,次幂值减一次幂
				sum/=2;
				i--;
				continue;
			}
			mi-=sum;
			al.add(i);
		}
		System.out.println(al);
		BigInteger an=new BigInteger("1");
		BigInteger answ=new BigInteger("1");
		int j=1;
		if(al.get(al.size()-1)==0) {
			an=an.multiply(new BigInteger("3"));
			al.remove(al.size()-1);
		}
		for(i=al.size()-1;i>=0;i--) {
			for(;j<=al.get(i);j++) {
				answ=answ.multiply(nine);
			}
			an=an.multiply(answ);
		}
		System.out.println(an);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值