超大数相乘的java代码,java版大数相乘

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

用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进行大数处理(BigInteger)-hdu1042

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1042 题目描述: 代码实现: import java.util.Scanner; import jav ...

POJ 2389&Tab;Bull Math&lpar;水~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&plus;&plus;版

#include #include 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&lpar;大数,ACM比赛专用)

用c或者C++处理大数比较麻烦,于是决心学习一下JAVA中大数运算. 先下载一个eclipse,具体的用法去问度娘吧 JAVA中有两个类BigInteger和BigDecimal分别表示大整数类和大浮 ...

Java实现大数乘法运算

基本思路:将输入的两个大数以字符串的形式存储,然后转化成整型数组存储,通过整型数组进行乘法运算(采用分治的思想) 即乘法分配律,如AB*CD=AC(AD+BC)BD,将两个数组逐位相乘的结果对位存放在 ...

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

常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结 ...

随机推荐

&lbrack;C&num;&rsqb; C&num; 知识回顾 - 表达式树 Expression Trees

C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...

python拆分CANLog

通过CANOE 导出的log通常有很多个ID的数据,如何才能找到某一个ID下的特殊的信号?利用python可以简单的进行这个步骤,代码如下: 说明: 最终的效果是将log信息,分不同的ID进行拆分,并 ...

Contains Duplicate III 下标范围&lt&semi;&equals;k 值范围&lt&semi;&equals;t

set妙用 1.维护一个大小最大位k的set set中数据是有顺序的 2.每次新加一个数据,只需要比较该数据加入 有没有带来变化 3.找到 >= 新数据-t的数据对应的迭代器 pos 4.如果找 ...

double保持精度,防止小数点后数字的丢失的小方法

一般情况下,输入带小数点的字面值,编译器会把它解析成double 类型. 例如:一个字面值被直接放到代码中,由于带小数点所以,默认值为double类型   输出结果是:1.12345678912345 ...

制作linux内核安装包

实验基于Centos 6.2 升级linux内核 直接在一个有编译环境的设备上,编译升级内核很简单. make menuconfig 或者 拷贝现有系统的.config文件 修改.config文件  ...

SSO(单点登录)

自己动手写SSO(单点登录) 标签: sso 登录 | 发表时间:2014-03-02 15:01 | 作者: 分享到: 出处:http://www.iteye.com SSO在我们的应用中非常常见, ...

PHP查看当前端口号

水题 ZOJ 3869 Ace of Aces

题目传送门 水题,找出出现次数最多的数字,若多个输出Nobody //#include //using namespace std; #include &l ...

TTTAttributedLabel使用介绍(转)

TTTAttributedLabel 库地址 https://github.com/TTTAttributedLabel/TTTAttributedLabel 可以实现电话  地址  链接自动查找显示 ...

c&plus;&plus; ,protected 和 private修饰的构造函数

c++ protected 和 private修饰的构造函数: 1.在类的外部创建对象时,不能调用protected或private修饰的构造函数. 2.当子类中的构造函数调用父类的private构造 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值