zoukankan      html  css  js  c++  java
  • 大整数运算

    蓝桥杯算法:高精度加法
    大整数加法:
    问题描述
      输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。
    算法描述
      由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。
      定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b。
      计算c = a + b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r,把和的个位数存入C[0],即C[0]等于(A[0]+B[0])%10。然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果又有进位产生,则仍可将新的进位存入到r中,和的个位存到C[1]中。依此类推,即可求出C的所有位。
      最后将C输出即可。
    输入格式
      输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。
    输出格式
      输出一行,表示a + b的值。
    样例输入
    20100122201001221234567890
    2010012220100122
    样例输出
    20100122203011233454668012
     
     1 import java.util.Scanner;
     2 
     3 public class Main {
     4     public static void main(String agrs[]){
     5         Scanner sc = new Scanner(System.in);
     6         String a = sc.next();
     7         String b = sc.next();
     8         Bigsum(a, b);
     9     }
    10     
    11     private static void Bigsum(String a,String b){
    12         int maxLength = a.length()>b.length()?a.length():b.length();
    13         int[] array1 = new int[maxLength+1];
    14         for(int i=0;i<a.length();i++){
    15             array1[i] = a.charAt(a.length()-1-i)-'0';
    16         }
    17         int[] array2 = new int[maxLength+1];
    18         for(int i=0;i<b.length();i++){
    19             array2[i] = b.charAt(b.length()-1-i)-'0';
    20         }
    21         int[] result = new int[maxLength+1];
    22         for(int i=0;i<result.length;i++){
    23             int temp = result[i];
    24             temp += array1[i];
    25             temp += array2[i];
    26             if(temp>=10){
    27                 result[i+1] = temp/10;  28                 result[i+1] = temp%10;
    29             }
    30             result[i] = temp;
    31         }
    32         
    33         StringBuffer sb = new StringBuffer();
    34                 //是否找到大整数的最高有效位
    35         boolean findFirst = false;
    36         for(int i=result.length-1;i>=0;i--){
    37             if(!findFirst){
    38                 if(result[i]==0){
    39                     continue;
    40                 }
    41                 findFirst = true;
    42             }
    43             sb.append(result[i]);
    44         }
    45         System.out.println(sb.toString());
    46     }
    47 
    48 }

    其中判断得到的大整数的最高有效位还可以这样操作:

     1  int book = 0;
     2 for(int i=maxLength-1;i>=0;i--) {
     3        if(result[i]>0) {
     4            book = i;    //找到大整数最高有效位不是0的位置
     5            break;
     6        }
     7          
     8    }
     9    for(int t=f;t>=0;t--) {
    10        System.out.print(k[t]);
    11    }

    更简单的方法就是直接使用BigDecimal:

     1 import java.math.BigDecimal;
     2 import java.util.Scanner;
     3 
     4 public class Main {
     5     public static void main(String agrs[]){
     6         BigDecimal aBigDecimal;
     7         BigDecimal bigDecimal;
     8         BigDecimal cBigDecimal;
     9         Scanner sc = new Scanner(System.in);
    10         aBigDecimal = sc.nextBigDecimal();
    11         bigDecimal = sc.nextBigDecimal();
    12         cBigDecimal = aBigDecimal.add(bigDecimal);
    13         System.out.println(cBigDecimal);
    14     }
    15 }

    问:大数如果包含了小数部分,该如何处理呢?

    答;比如 3.1415926 + 1314.9 ,可以都乘上10的7次方, 变成 31415926 + 13149000000, 得到的结果再除以10的7次方。

    【优化】:原整数拆分到可以被直接计算就可以,int类型的取值范围是-2147483648 — 2147483648,最多有10位整数,为了防止溢出,可以把大整数的每9位作为数组的一个元素。(也可以按照long类型拆分)如将60位整数可以拆分为长度为7的数组,每个元素存储9位。

    【注】:拆分的时候,每一个9位数内部不反转,但9位数之间可以反转。

    大整数乘法:

    分两步:首先将整数B的每一个数位和整数A依次相乘,得到中间结果。然后将所有中间结果相加,得到最终结果。

     1     public static String multiply(String a,String b){
     2         int length1 = a.length();
     3         int length2 = b.length();
     4         int[] array1 = new int[length1];
     5         for(int i=0;i<length1;i++){
     6             array1[i] = a.charAt(length1-1-i)-'0';
     7         }
     8         int[] array2 = new int[length2];
     9         for(int i=0;i<length2;i++){
    10             array2[i] = b.charAt(length2-1-i)-'0';
    11         }
    12         
    13         int[] result = new int[length1+length2];
    14         for(int i=0;i<length2;i++){
    15             for(int j=0;j<length1;j++){
    16                 result[i+j] += array2[i]*array1[j];
    17                 if(result[i+j] >= 10){
    18                     result[i+j+1] += result[i+j]/10;
    19                     result[i+j] = result[i+j]%10;
    20                 }
    21             }
    22         }
    23 
    24         StringBuilder sb = new StringBuilder();
    25         boolean findFirst = false;
    26         for(int i=result.length-1;i>=0;i--){
    27             if(!findFirst){
    28                 if(result[i] == 0){
    29                     continue;
    30                 }
    31                 findFirst = true;
    32             }
    33             sb.append(result[i]);
    34         }
    35         return sb.toString();
    36     }
  • 相关阅读:
    兼容性和工程化
    对象
    用JavaScript实现学生管理系统
    用JavaScript实现视频弹幕发送
    数据结构
    数据结构和函数
    JavaScript的基本语法
    JS概括及基本语法
    MongoDB数据库的简单安装与使用
    epxress 的安装与配置
  • 原文地址:https://www.cnblogs.com/AIchangetheworld/p/12491829.html
Copyright © 2011-2022 走看看