zoukankan      html  css  js  c++  java
  • 大数计算问题

    在求阶乘问题上,我们可以使用循环或者递归的思想,如果数值范围超过基本数据类型,可以使用java中的BigDecimal和BigInteger类;但是如果不使用java中这两个类怎么来计算呢?

    拿两个数相乘来说,思路在于观察我们如何手工计算相乘,用程序来模拟手工计算相乘即可

     1 import java.util.Scanner;
     2 
     3 /**
     4  * 大数相乘问题
     5  * @author zbt
     6  *
     7  */
     8 public class MyBigData {
     9 
    10     public static void main(String[] args) {
    11         Scanner sc = new Scanner(System.in);
    12         String s1 = sc.next();
    13         String s2 = sc.next();
    14         int[] arr1 = new int[s1.length()];
    15         int[] arr2 = new int[s2.length()];
    16         int j = 0;
    17         for (int i = s1.length() - 1; i >= 0; i--) {//逆序以数组形式存储字符串s1
    18             arr1[j] = Integer.valueOf(String.valueOf(s1.charAt(i)));
    19             j++;
    20         }
    21         j = 0;
    22         for (int i = s2.length() - 1; i >= 0; i--) {//逆序以数组形式存储字符串s2
    23             arr2[j] = Integer.valueOf(String.valueOf(s2.charAt(i)));
    24             j++;
    25         }
    26         
    27         mutiply(arr1, arr2);
    28         sc.close();
    29 
    30     }
    31 
    32     public static void mutiply(int[] arr1, int[] arr2) {//计算方法
    33         int[] arr3 = new int[100];//创建一个容量足够大的数组来存储各个位的结果
    34         for (int i = 0; i < arr1.length; i++) {
    35             for (int j = 0; j < arr2.length; j++) {
    36                 arr3[i + j] += arr1[i] * arr2[j];//关键点
    37             }
    38         }
    39 // for(int arr4 : arr3){
    40 // System.out.println(arr4);
    41 // }
    42         int carry = 0;//初始进位为0
    43         for (int i = 0; i < arr3.length; i++) {
    44             if ((arr3[i] + carry) >= 10) {
    45                 int tem = arr3[i] + carry;//本位的值加上低位的进位值,并覆盖本位
    46                 carry = tem / 10;//本位向高位的进位
    47                 arr3[i] = tem % 10;//新的本位值
    48             } else {
    49                 arr3[i] += carry;//这里会产生无用功,具体为最高位计算完后,数组其余元素(均为0)会继续计算
    50                 carry = 0;
    51             }
    52         }
    53         int index = 0;//用来寻找不等于0的最高位,以便输出值排除多余0
    54         for (int i = arr3.length - 1; i >= 0; i--) {
    55             if (arr3[i] != 0) {
    56                 index = i;
    57                 break;//若找到第一个不为0的最高位,终止循环
    58             }
    59         }
    60 // System.out.println(index);
    61 
    62         for (int i = index; i >= 0; i--) {//易数组形式输出大数
    63             System.out.print(arr3[i]);
    64         }
    65     }
    66 
    67 }

    参考资料:http://blog.csdn.net/lichong_87/article/details/6860329

                  http://blog.csdn.net/oh_maxy/article/details/10903929?utm_source=tuicool&utm_medium=referral

                  http://www.cnblogs.com/lr-ting/p/3998478.html

  • 相关阅读:
    codevs 2010 求后序遍历
    code vs 1013 求先序排列
    codevs 3143 二叉树的序遍历
    codevs 3083 二叉树
    找树的根和孩子
    1501 二叉树最大宽度和高度
    1758:二叉树
    sql 如何把查询得到的结果如何放入一个新表中
    2011的n次方
    计算2的N次方
  • 原文地址:https://www.cnblogs.com/crazybuddy/p/5339338.html
Copyright © 2011-2022 走看看