JAVA版拆分大整数为2幂的和算法

import java.util.ArrayList;
import java.util.List;

public class StrTest {

    public static void main(String[] args)
    {
        //模拟生成一个大整数
        Long n=ShengCheng();

        //拆分这个大整数,看看是由哪些东东组成的
        List<Long> list  =SplitNumber(n);

        for(int i=0;i<list.size();i++)
        {
            System.out.println(list.get(i));
        }
    }

    /**
     * 功能:计算2的整数次方
     * 作者:黄海
     * 时间:2016-01-20
     * @param n
     * @return
     */
    private static long GetNumberById(int n)
    {
        return (long) Math.pow(2,n);
    }
    /**
     * 功能:模拟生成一个以2的整数次方为和加在一起的一个整数
     * 作者:黄海
     * 时间:2016-01-20
     * @return
     */
    private static long ShengCheng()
    {
        long a=GetNumberById(1)+GetNumberById(2)+GetNumberById(3)+GetNumberById(5)+GetNumberById(8)+GetNumberById(12)+GetNumberById(50);
        System.out.println(a);
        return a;
    }
    /**
     * 功能:将一个以2的整数次方为和加在一起的一个整数进行分拆,分拆成一个个2的整数次方形式
     * @param n
     * @return
     */
    private static List<Long> SplitNumber(long n)
    {
        List<Long> list  = new ArrayList<Long>();
        String s=Long.toBinaryString(n);
        int len=s.length();
        for(int i=0;i<len;i++)
        {
            Long cur=Long.parseLong(s.substring(len-i-1,len-i));
            if(cur>0)
            {
                list.add(GetNumberById(i));
            }
        }
            return list;
    }
}
时间: 2024-10-20 22:15:51

JAVA版拆分大整数为2幂的和算法的相关文章

大整数分解质因数(Pollard rho算法)

#include <iostream> #include <cstring> #include <cstdlib> #include <stdio.h> #include <algorithm> #include <math.h> #include <stdlib.h> #include<time.h> #define ll long long #define INF 0x3f3f3f3f #define ma

Java 实现大整数加减乘除

自己用Java实现的大整数加减乘除运算.还有可以改进的地方,有兴趣的童鞋可以加以改进.仅供参考,请勿转载! package barrytest; import java.util.ArrayList;import java.util.List;import java.util.regex.Matcher;import java.util.regex.Pattern; //@author Barry Wang// all the four method have not considered th

求两个大整数相乘的积,数字长度在127个字符之内。

计算两个大整数相乘的结果,数字不是double类型能表示的,数字长度没有限制(最大127位). 方法一:使用java中的大整数处理库函数,java.math.BigInteger,java.math.BigDecimal; 方法二:不利用库函数,自己实现其功能,可以练习自己对待复杂问题的处理能力,提高编程水平. 此代码中利于两者的结合,利于库函数可以看自己编写的代码的正确性. 1.主函数 import java.math.BigDecimal; import java.util.Scanner;

POJ 1181 大整数是否为素数以及求大整数的质因数-数论-(Miller_rabin+Pollard_rho)

题意:求一个整数是否是素数,如果不是,则输出它最小的质因数. 分析: 判断一个大整数是否为素数用Miller_rabin算法,求一个大整数的所有质因数用Pollard_rho算法.这题就是直接套模板. 另外这里的gcd和pow_mod不能用一般的方式,T了.代码里我注释掉的就是T了的写法. 代码: #include<iostream> #include<cmath> #include<ctime> #include<cstdio> #include<a

大整数算法[02] 基本的操作(维护算法)

上一篇博文简单介绍了大整数的表示方法,这次开始介绍一些基本的算法.       ★ 初始化和清除 编写大整数函数的出发点是bignum结构的初始化和清除,在其他大部分算法当中,这两个算法都会用到. 对于给定的bignum结构,初始化有两种情况:一是仅仅把bignum结构的dp指向NULL,二是初始化的时候顺便分配一定的动态内存,并让dp指针指向这块内存.其实我本来打算只用第二种方式进行初始化,不过考虑到初始内存可能分配过多导致内存浪费,于是决定两种方式一起使用.第一种方式的优点是在后面编程中你不

suseoj 1207: 大整数的乘法(java, 大数相乘)

1207: 大整数的乘法 时间限制: 1 Sec  内存限制: 128 MB提交: 7  解决: 2[提交][状态][讨论版][命题人:liyuansong] 题目描述 求两个不超过200位的非负整数的积. 输入 有两行,每行是一个不超过200位的非负整数,没有多余的前导0. 输出 一行,即相乘后的结果.结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342. 样例输入 12345678900 98765432100 样例输出 1219326311126352690000 分析:

大整数相乘问题总结以及Java实现

最近在跟coursera上斯坦福大学的算法专项课,其中开篇提到了两个整数相乘的问题,其中最简单的方法就是模拟我们小学的整数乘法,可想而知这不是比较好的算法,这门课可以说非常棒,带领我们不断探索更优的算法,然后介绍可以通过使用分而治之的思想来解决这个问题.下面对该问题的方法以及实现进行介绍. 问题定义 输入:2个n位的整数x和y 输出:x * y 如求: 1234567891011121314151617181*2019181716151413121110987654 的结果 求解该问题要注意的是

用Java的大整数类Integer来实现大整数的一些运算

import java.io.*; import java.util.*; import java.math.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); BigInteger a, b; while(sc.hasNext()) { a = sc.nextBigInteger(); b = sc.nextBigInteger(); Syste

Pollard-Rho大整数拆分模板

随机拆分,简直机智. 关于过程可以看http://wenku.baidu.com/link?url=JPlP8watmyGVDdjgiLpcytC0lazh4Leg3s53WIx1_Pp_Y6DJTC8QkZZqmiDIxvgFePUzFJ1KF1G5xVVAoUZpxdw9GN-S46eVeiJ6Q-zXdei 看完后,觉得随机生成数然后和n计算gcd,可以将随机的次数根号一下.思想很叼. 对于里面说的birthday trick,在执行次数上我怎么看都只能减一半.只是把平均分布,变成了靠近0