背景
一些基本数据类型的范围:
- 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
- 大数问题(合辑) - https://blog.csdn.net/whjkm/article/details/38148893
- 【算法】大数乘法问题及其高效算法 - https://itimetraveler.github.io/2017/08/22/%E3%80%90%E7%AE%97%E6%B3%95%E3%80%91%E5%A4%A7%E6%95%B0%E7%9B%B8%E4%B9%98%E9%97%AE%E9%A2%98%E5%8F%8A%E5%85%B6%E9%AB%98%E6%95%88%E7%AE%97%E6%B3%95/