java版大数相乘

在搞ACM的时候遇到大数相乘的问题,在网上找了一下,看到了一个c++版本的

http://blog.csdn.net/jianzhibeihang/article/details/4948267

用java搞了一个版本

这里说一下思路

将数字已字符串形式接收,转换成int[]整型数组,然后num1[],num2[]依次相乘,结果保存到result[]中

其他注意的在注释中有说明

 1 package com.gxf.test;
 2
 3 import java.util.Scanner;
 4
 5 public class BigDataMultiply {
 6
 7     public static void main(String[] args) {
 8         final int N = 100;//最大为100位数字相乘
 9         Scanner scanner = new Scanner(System.in);
10
11         int num1[] = getNum(scanner);//保存第一个数12345
12         int num2[] = getNum(scanner);//保存第二个数12345
13
14         int result[] = new int[2 * N];
15         //第一个数12345每一位乘以第二个数12345的每一位,得到的结果放到result[]中
16         //注意5乘以每一位数字保存在result[0] [1] [2] [3] [4]中
17         //4乘以每一位数字时要加上[1] [2] [3] [4]中的值
18         for(int i = 0; i < num1.length; i++){
19             for(int j = 0; j < num2.length; j++){
20                 result[i + j] += num1[i] * num2[j];
21             }
22         }//得到的结果还需进位和移位处理
23         //进位和移位处理
24         for(int i = 0; i < 2 * N - 1; i++){
25             result[i + 1] += result[i] / 10;
26             result[i] = result[i] % 10;
27         }
28         //找出结果长度
29         int length = 2 * N -1;
30         while(result[length] == 0)
31             length--;
32         //输出结果 注意先输出高位 最高位保存在数组的高下标中
33         for(int i = length; i >= 0; i--){
34             System.out.print(result[i] + " ");
35         }
36         scanner.close();
37     }
38     public static int[] getNum(Scanner scanner){
39         final int N = 100;
40         int num[] = new int[N];
41         char array_char[];
42         String str_num = "";
43         //Scanner scanner = new Scanner(System.in);//用于接收输入
44
45         str_num = scanner.next();
46         array_char = str_num.toCharArray();//字符串12345已经转换成字符数组
47         //将字符数组转换成Int数组
48         int length = array_char.length;
49         for(int i = 0; i < array_char.length; i++){
50             num[length - i - 1] = array_char[i] - ‘0‘;//这里注意保存的位置 高位保存在数组高下标中 低位保存在数组低下标中
51             //因为后面计算的时候是从低下标中的
52             //num[i] = array_char[i]
53         }
54         //scanner.close();
55         return num;
56     }
57 }

ps:为什么这里result[]大小是2*N,假设两个数是3位数,如565 * 898不可能大过1000 * 1000,而1000 * 1000的位数刚好是 2 * 3 = 6位

时间: 2024-08-08 22:05:45

java版大数相乘的相关文章

Stanford Algorithms(一): 大数相乘(c++版)

Stanford Algorithms(一): 大数相乘(c++版) 刚不就在中国大学Mooc上参加了陈越老师的数据结构的课程,收获很大.觉得趁热打铁,也把算法的部分也给一块学了吧,就在Coursera上注册了一个斯坦福大学的算法课,课程的量很重,估计要学一个学期吧,慢慢的学,稳扎稳打. 课程里推荐了很多书,我找了一本, 书名就叫Algorithms,作者是S.Dasgupta教授,简单翻看了一下,觉得写的挺不错,就姑且把这本书当做教材了. 还是那句话,贵精不贵多,一门学深入了,收获就会很大,总

大数相乘算法C++版

#include <iostream> #include <cstring> using namespace std; #define null 0 #define MAXN 51 //大数相乘 char *big_cheng(char line1[], char line2[]) { short s1[MAXN], s2[MAXN], s[MAXN];//s1,s2:两个乘数:s:乘积的结果 int i, j, k, c; int len1, len2, len; len1 =

排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结束.时间复杂度:O(n^2) 选择排序:每次在无序队列中"选择"出最大值,放到有序队列的最后,并从无序队列中去除该值(具体实现略有区别).时间复杂度:O(n^2) 直接插入排序:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的 移动数据,空出一个适当的位置,把待插

海豚实习-实现两个大数相乘

问题描述:定义大数d为一个数组,表示为:d=a[k-1]*10^(k-1)+a[k-2]*10^(k-2)+...+a[1]*10+a[0](k为数组长度),实现一个函数,返回两个大数相乘的结果 /** d1=a[k-1]*10^(k-1)+a[k-2]*10^(k-2)+...+a[1]*10+a[0] d2=b[l-1]*10^(l-1)+b[l-2]*10^(l-2)+...+b[1]*10+b[0] d1*d2 包含k*l项,这只是没有合并的 每一项可以表示为:d*10^x,然后将(x,

大数相乘和大数相加。

/* *大数相乘 求n的阶乘. */ import java.math.BigInteger;import java.util.Scanner; public class BigMultiply { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); System.out.println(calcM(N)); } public static Stri

实现两个大数相乘

牛客网链接-大数相乘 思路: 内心知道这种方法是可以通过的,但是贼鸡儿麻烦. 输入两个字符串.按照笔算乘法的方式,循环计算.考虑到进位的问题. 代码: package top.simuhunluo; import java.util.Scanner; public class Main { static StringBuffer[] results; static boolean z = true; public static void main(String[] args) { Scanner

Java版贪吃蛇(比较完善的版本)

很认真的写的一个java版的贪吃蛇游戏,图形界面,支持菜单操作,键盘监听,可加速,减速,统计得分,设定运动速度,设定游戏背景颜色等!应该没有Bug了,因为全被我修改没了.哈哈. 下面是项目各包及类的层次关系: 游戏的主要运行界面截图如下: 下面是部分代码,详细源码见此链接:http://pan.baidu.com/s/1bnubnzh //Snake类: package com.huowolf.entities; import java.awt.Color; import java.awt.Gr

回溯算法解八皇后问题(java版)

八皇后问题是学习回溯算法时不得不提的一个问题,用回溯算法解决该问题逻辑比较简单. 下面用java版的回溯算法来解决八皇后问题. 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列.直到所有皇后都放完,或者放哪

pureMVC java版搭建流程

转自:http://blog.csdn.net/sutaizi/article/details/6588004 pureMVC 是一个轻量级的框架 它在 flex中非常流行(和cairngorm差不多火) 目前几乎已经移植到所有平台上. 下面实现java版得pureMVC搭建 先给大家看总体的层次: 众所周知 pureMVC是一个轻量级的MVC框架 分为 Model ,View ,Controller.这三个是pureMVC的核心. 除此之外pureMVC中含有一个单例模式Facade.faca