java版大数相乘
在搞ACM的时候遇到大数相乘的问题,在网上找了一下,看到了一个c++版本的
http://blog.csdn.net/jianzhibeihang/article/details/4948267
用java搞了一个版本
这里说一下思路
将数字已字符串形式接收,转换成int[]整型数组,然后num1[],num2[]依次相乘,结果保存到result[]中
其他注意的在注释中有说明
package com.gxf.test;
import java.util.Scanner;
public class BigDataMultiply {
public static void main(String[] args) {
final int N = 100;//最大为100位数字相乘
Scanner scanner = new Scanner(System.in);
int num1[] = getNum(scanner);//保存第一个数12345
int num2[] = getNum(scanner);//保存第二个数12345
int result[] = new int[2 * N];
//第一个数12345每一位乘以第二个数12345的每一位,得到的结果放到result[]中
//注意5乘以每一位数字保存在result[0] [1] [2] [3] [4]中
//4乘以每一位数字时要加上[1] [2] [3] [4]中的值
for(int i = 0; i < num1.length; i++){
for(int j = 0; j < num2.length; j++){
result[i + j] += num1[i] * num2[j];
}
}//得到的结果还需进位和移位处理
//进位和移位处理
for(int i = 0; i < 2 * N - 1; i++){
result[i + 1] += result[i] / 10;
result[i] = result[i] % 10;
}
//找出结果长度
int length = 2 * N -1;
while(result[length] == 0)
length--;
//输出结果 注意先输出高位 最高位保存在数组的高下标中
for(int i = length; i >= 0; i--){
System.out.print(result[i] + " ");
}
scanner.close();
}
public static int[] getNum(Scanner scanner){
final int N = 100;
int num[] = new int[N];
char array_char[];
String str_num = "";
//Scanner scanner = new Scanner(System.in);//用于接收输入
str_num = scanner.next();
array_char = str_num.toCharArray();//字符串12345已经转换成字符数组
//将字符数组转换成Int数组
int length = array_char.length;
for(int i = 0; i < array_char.length; i++){
num[length - i - 1] = array_char[i] - '0';//这里注意保存的位置 高位保存在数组高下标中 低位保存在数组低下标中
//因为后面计算的时候是从低下标中的
//num[i] = array_char[i]
}
//scanner.close();
return num;
}
}
ps:为什么这里result[]大小是2*N,假设两个数是3位数,如565 * 898不可能大过1000 * 1000,而1000 * 1000的位数刚好是 2 * 3 = 6位
java版大数相乘的更多相关文章
- 用Java进行大数处理(BigInteger)-hdu1042
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1042 题目描述: 代码实现: import java.util.Scanner; import jav ...
- POJ 2389 Bull Math(水~Java -大数相乘)
题目链接:http://poj.org/problem?id=2389 题目大意: 大数相乘. 解题思路: java BigInteger类解决 o.0 AC Code: import java.ma ...
- Java实现大数相加、相乘(不使用BigInteger)
大数相加: package algorithm; //使用BigInteger类验证 import java.math.BigInteger; public class BigAdd { public ...
- 大数相乘算法C++版
#include <iostream> #include <cstring> using namespace std; #define null 0 #define MAXN ...
- Java 大数相乘、大数相加、大数相减
思路来源:: https://blog.csdn.net/lichong_87/article/details/6860329 /** * @date 2018/6/22 * @description ...
- 华为上机测试题(大数相乘-java)
PS:这个不是自己写的,测试OK,供参考. /** * 大数相乘 */ public class BigData { public static void main(String[] args) { ...
- Java BigInteger(大数,ACM比赛专用)
用c或者C++处理大数比较麻烦,于是决心学习一下JAVA中大数运算. 先下载一个eclipse,具体的用法去问度娘吧 JAVA中有两个类BigInteger和BigDecimal分别表示大整数类和大浮 ...
- Java实现大数乘法运算
基本思路:将输入的两个大数以字符串的形式存储,然后转化成整型数组存储,通过整型数组进行乘法运算(采用分治的思想) 即乘法分配律,如AB*CD=AC(AD+BC)BD,将两个数组逐位相乘的结果对位存放在 ...
- 排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题
常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结 ...
随机推荐
- sphinx 超好资料
http://www.ttlsa.com/?s=sphinx
- hbase 各个概念,region,storefile
HBase中有两张特殊的Table,-ROOT-和.META. .META.:记录了用户表的Region信息,它可以有多高region(这的意思是说.META.表可以分 裂成多个region,和用户表 ...
- Linux下运行top命令显示的PR\NI\RES\SHR\S\%MEM TIME+都代表什么
PID 进程号 USER 用户名 PR 优先级 NI nice值.负值表示高优先级,正值表示低优先级 RES 进程使用的.未被换出的物理内存大小,单位Kb S 进程状态: D 不可中断的睡眠状态 R ...
- SqlServer 事务和异常处理示例
BEGIN TRANSACTION--开始事务 DECLARE @errorSun INT --定义错误计数器SET @errorSun=0 --没错为0 UPDATE dbo.Test SET te ...
- 必须会的SQL语句(五)NULL数据处理和类型转换
1.Null数据的处理 1)检索出null值 select * from 表 where xx is null 2)null值替换 sele ...
- 【风马一族_php】PHP与Mysql建立连接
让php发出 Hi作为基础 http://www.cnblogs.com/sows/p/5990157.html 配置apache ../apache/conf/httpd.conf 创建p ...
- 软件工程 speedsnail 冲刺3
2015-5-7 完成任务:环境崩溃,重新配置环境,学习了黑马android教学视频前6集: 遇到问题: 问题1 Error: Error parsing C:\Users\sam\.android\ ...
- Objective-C数据类型、数据类型转换
数据类型 1.Objective-C数据类型可以分为:基本数据类型.对象数据类型和id类型. 2.基本数据类型有:int.float.double和char类型. 3.对象类型就是类或协议所声明的指针 ...
- php设计模式之Proxy(代理模式)和Facade(外观)设计模式
Proxy(代理模式)和Facade(外观)设计模式它们均为更复杂的功能提供抽象化的概念,但这两种实现抽象化的过程大不相同 Proxy案例中,所有的方法和成员变量都来自于目标对象,必要时,该代理能够对 ...
- js方法和原型继承(一)
在js语言规范中并不存在方法这一概念,方便起见,将作为对象属性的函数成为方法this引用的规则a.在最外层代码中,this引用的是全局对象b.在函数内,this引用根据函数调用方式不同而不同函数内部的 ...