大数计算问题

在求阶乘问题上,我们可以使用循环或者递归的思想,如果数值范围超过基本数据类型,可以使用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

时间: 2024-11-08 19:16:25

大数计算问题的相关文章

一步一步写算法(之大数计算)

原文:一步一步写算法(之大数计算) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 我们知道在x86的32位cpu上面,int表示32位,如果核算成整数的话,大约是40多亿.同样,如果在64位cpu上面,能表示的最大整数就是64位二进制,表示的数值要大得多.那么在32位如果想表示大整数怎么办呢?那只能靠我们自己想办法了. 首先我们回顾一下我们手算整数的加减.乘除法是怎么做到的: (1)记住9*9之间的乘法口诀 (2)记住个位与个位之间的加

重温当年入门战之大数计算

大数计算: 由于编程语言提供的基本数值数据类型表示的数值范围有限,不能满足较大规模的高精度数值计算,因此需要利用其他方法实现高精度数值的计算,于是产生了大数运算. 大数计算简析:        大数计算实现的理论是,首先提取输入值赋予指定String字符串. 通过String.charAt(index)提取每一位的值,赋予int数组. 然后求相乘每一位的值和进位. 直到最后每一位都求出来. 代码实现:         1 import java.awt.*; 2 import java.awt.

java 大数计算

这几天做了几道用大数的题,发现java来做大数运算十分方便.对acmer来说是十分实用的 1 import java.io.*; 2 import java.math.BigInteger; 3 import java.util.*; 4 public class Main { 5 6 public static void main(String[] args) { 7 // TODO Auto-generated method stub 8 Scanner cin=new Scanner (n

HDU 1042 大数计算

这道题一开始就采用将一万个解的表打好的话,虽然时间效率比较高,但是内存占用太大,就MLE 这里写好大数后,每次输入一个n,然后再老老实实一个个求阶层就好 java代码: 1 /** 2 * @(#)Main.java 3 * 4 * 5 * @author 6 * @version 1.00 2014/12/21 7 */ 8 import java.util.*; 9 import java.math.*; 10 11 public class Main { 12 //public stati

HDU 1131 Count the Trees 大数计算

题目是说给出一个数字,然后以1到这个数为序号当做二叉树的结点,问总共有几种组成二叉树的方式.这个题就是用卡特兰数算出个数,然后因为有编号,不同的编号对应不同的方式,所以结果是卡特兰数乘这个数的阶乘种方案.因为数字比较大,所以要用高精度的方法也就是用字符数组来做,我分别写了三个函数,一个算加法,一个算乘法,最后一个打表,等打出表来最后只要判断一下输入的数是第几个,直接输出就行了,下面是我的代码,第一次写高精度的这种大数处理,可能看上去比较繁琐= = #include<iostream> #inc

大数计算

#include<iostream> #include<stdint.h> #include<algorithm> #include<map> #include<set> #include<vector> #include<queue> #include<stack> #include<math.h> #include<iostream> #include<string> #

就一个简单的大数计算

也只是刚刚写出了加法,用的是1 000 000 000进制,不过发现对于加法还不如用最基本的方法方便.用1 000 000 000进制的方便也就在于处理乘法和除法了.计算机做乘除运算还是比较耗时的. #include <random> #include <iostream> #include <fstream> #include <string> #include <vector> #include <utility> using n

c++大数计算模板

1.大数相加 string sum(string s1,string s2) { if(s1.length()<s2.length()) { string temp=s1; s1=s2; s2=temp; } int i,j; for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--) { s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0)); //注意细节 if(s1[i]-'0'>=10) { s1[i]=char((

Java的大数计算BigNumber

Notice that the number 123456789 is a 9-digit number consisting exactly the numbers from 1 to 9, with no duplication. Double it we will obtain 246913578, which happens to be another 9-digit number consisting exactly the numbers from 1 to 9, only in a