算法刷题

1005/1027/1029大数简单运算

① BigInteger
  • 创建赋值: BigInteger a=new BigInteger(in.readLine());
  • 方法:

a.add(b);
subtract:-
multiply:*
divide:/
pow:a.pow(b)=a^b
a.gcd,abs():公约数,绝对值
mod:a.mod(b)=a%b;
//到商和余数 返回数组
System.out.println(a.divideAndRemainder(b)[1]);
compareTo方法来比较,小于则返回-1,等于则返回0,大于则返回1

BigInteger a1 = new BigInteger(“1”);
BigInteger a2 = new BigInteger(“2”);
a1.compareTo(a2);

1030 (大数)进制转换

①Integer进制转换

十进制转成十六进制:
Integer.toHexString(int i)

十进制转成八进制
Integer.toOctalString(int i)

十进制转成二进制
Integer.toBinaryString(int i)

十六进制转成十进制
Integer.valueOf(“FFFF”,16).toString()

八进制转成十进制
Integer.valueOf(“876”,8).toString()

二进制转十进制
Integer.valueOf(“0101”,2).toString()

②大数进制转换
  1. BigInteger的构造函数
    BigInteger(String src)默认参数字符串为10进制数值
    BigInteger(String src, int x)
    第2个参数x是指定第一个参数src的进制类型

  2. toString方法
    toString()默认把数值按10进制数值转化为字符串。
    toString(int x)把数值按参数x的进制转化为字符串。

1117大数开方

牛顿迭代法+FFT

时间复杂度为 O(n)。
(还不会)

import java.math.BigInteger;
import java.util.Arrays;

/**
 * Created by MGL on 2017/4/21.
 */
public class BigInteger_Sqrt{
    public static void main(String[] args) {
        String str = "846516548651346132456465132189465134894651645613";
        BigInteger n1 = new BigInteger(str);
        BigInteger multiply = n1.multiply(n1);
        int length = multiply.toString().length();
        System.out.println("数的长度 = " + length);
        long start = System.nanoTime();
        BigInteger sqrt = getSqrt(multiply);
        long end = System.nanoTime();
        System.out.println(end - start);
        System.out.println("对" +length +"位数进行开放运算所需要的时间 = " + (end - start)/1000000000F + "s");
        System.out.println("运算结果 = " + (sqrt.compareTo(n1) == 0));
    }

    private static BigInteger getSqrt(BigInteger num) {
        String s = num.toString();
        int mlen = s.length();    //被开方数的长度
        int len;    //开方后的长度
        BigInteger beSqrtNum = new BigInteger(s);//被开方数
        BigInteger sqrtOfNum;    //存储开方后的数
        BigInteger sqrtOfNumMul;    //开方数的平方
        String sString;//存储sArray转化后的字符串
        if (mlen % 2 == 0) len = mlen / 2;
        else len = mlen / 2 + 1;
        char[] sArray = new char[len];
        Arrays.fill(sArray, '0');//开方数初始化为0
        for (int pos = 0; pos < len; pos++) {
            //从最高开始遍历数组,
            //每一位都转化为开方数平方后刚好不大于被开方数的程度
            for (char ch = '1'; ch <= '9'; ch++) {
                sArray[pos] = ch;
                sString = String.valueOf(sArray);
                sqrtOfNum = new BigInteger(sString);
                sqrtOfNumMul = sqrtOfNum.multiply(sqrtOfNum);
                if (sqrtOfNumMul.compareTo(beSqrtNum) == 1) {
                    sArray[pos] -= 1;
                    break;
                }
            }
        }
        return new BigInteger(String.valueOf(sArray));
    }
}

1019逆序数

对象排序

class Item implements Comparable{
    int val;
    int loc;
    Item(int v,int l){
        val=v;
        loc=l;
    }
    public int compareTo(Object o) {
        return this.val - ((Item) o).getVal();
      }
    public int getVal() {
        return val;
    }
    public int getLoc() {
        return loc;
    }
}

再用Arrays.sort(arr)就可以排序了

[ATTENTION]
凡逆序对此处用树状数组解决,步骤:

  • 记住 源数据obj.val 位置obj.loc
  • 新建计算数组d[] 初始化为1,然后已经找到的数字变为0
  • 对数据obj.val排序 从小到大找再看未排序前有几个数字 和便是逆序对的数目

    1046 A^BmodC

    二分快速幂公式(2因为b是奇数b/2少了1则加上一个1 即乘以2)
    这里写图片描述
    代码实现
    循环次数:log2b

    long ans=1;  
        while(b>0){  
            if(b%2==1){       //如果b是奇数  
                ans=ans*a%n;  
            }     
            b=b/2;  
            a=a*a%n;  
        }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值