【Algorithm】BigNum 原理

Posted by 西维蜀黍 on 2019-07-29, Last Modified on 2023-09-02

背景

一些基本数据类型的范围:

  • int:32位整数,占4字节,-2^31~2^31-1(-21亿多~21亿多)
  • unsigned int:占4字节,0~2^32-1(0~42亿多) –10位数

VC的64位整数 :

  • _int64:占8字节,-2^63~2^63-1(-900亿亿多~900亿亿多)
  • unsigned int64:占8字节,0~2^64-1(0~1800亿亿多)-20位数
  • G++的64位整数:
    • long long==int64
    • unsigned long long==unsigned __int64

实数:

  • float:占4字节,7位有效数字
  • double:占8字节,15位有效数字

浮点型的问题都是追求精度的,在一般情况下我们应当选择使用double,而很少用float;

所以当我们要进行计算的数超过了20位,我们就要用数组来模拟我们的计算过程了;

大整数加法

大整数的加法之类的,算法比较简单,按照我们平时竖式计算的方式,用数组模拟大数的加法,要注意的就是处理好之间的进位问题,然后其中的输入输出也要注意,转化成我们习惯的那种方式去进行计算,输出的时候要处理好前端零;

public static void main(String[] args) {
    Scanner scanf = new Scanner(System.in);
    int t = scanf.nextInt();
    for (int i = 1; i <= t; i++) {
        BigInteger a = scanf.nextBigInteger();
        BigInteger b = scanf.nextBigInteger();
        BigInteger sum = a.add(b);
        System.out.println("Case " + i + ":");
        System.out.println(a + " + " + b + " = " + sum);
    }
}

大整数乘法

乘法和加法的思想基本上一致,这里要注意的是,i和j位置相乘的结果要保存在结果数组的i+j的位置;

public static void main(String args[])
{
	Scanner cin = new Scanner(System.in);	
	int n = cin.nextInt();
	BigInteger ans = BigInteger.ONE;
	for(int i = 1; i <= n; ++i)
		ans = ans.multiply(BigInteger.valueOf(i));
	System.out.println(ans);
}

大整数减法

减法和加法的思想基本一致;把程序中的加法换成减法,进位处理的时候注意;

大数比较大小

public static void main(String args[])
{
	Scanner cin = new Scanner(System.in);	
	while(cin.hasNext())
	{
		BigInteger a = cin.nextBigInteger();
		BigInteger b = cin.nextBigInteger();
		if(a.equals(BigInteger.ZERO) && b.equals(BigInteger.ZERO))
			break;
		int flag = a.compareTo(b);
		if(flag == -1)
			System.out.println("a<b");
		else if(flag == 0)
			System.out.println("a==b");
		else
			System.out.println("a>b");
	}
}

Reference