把一个整数分解为2的幂次的算法

任何数都可以分解为2的幂,假定给一个整数n,把他转换为以下形式:

比如n = 7时。

7=1+1+1+1+1+1+1
  =1+1+1+1+1+2
  =1+1+1+2+2
  =1+2+2+2
  =1+1+1+4
  =1+2+4

共有6种划分方法。

 

这里用到递归算法:f(2m+1)=f(2m); f(2m)=f(2m-1)+f(m);点击打开链接:原文

以下是java代码:

public class IntegerTest

{

          public static void main(String[] args)

        {

           Scanner in=new Scanner(new InputStreamReader(System.in));

           BigInteger[] num=new BigInterger[1000002];

           num[1]=BigInteger.valueof(1);

           for(int i=2;i<=n;i++) 

           {

               if(i%2==0)

              {

                      num[i]=num[i-1].add(num[i/2]);

               }

               else

              {

                      num[i]=num[i-1];

               }

           

           }    

           System.out.println(num[n]);  

        }

}

悟:递归算法,这里是从1到n,以下是从n到1

public class CalculateTest {
static BigInteger[] num=new BigInteger[1000002];
         public static void main(String[] args)
         {
        Scanner in=new Scanner(new InputStreamReader(System.in));
        int n=in.nextInt();
        calculateNext(n);
        System.out.println(num[n]);
         }
        

        public  static void calculateNext(int n)
        {
        if(n>=2)
        {
        if(n%2==0)
        {
       
        calculateNext(n-1);
        calculateNext(n/2);
        num[n]=num[n-1].add(num[n/2]);
        }
        else
        {
        calculateNext(n-1);
        num[n]=num[n-1];
        }
        }
        else
        {
        num[1]=BigInteger.valueOf(1);
        }
        }


}

经过运行,两种方法结果相同,哦也~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值