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个数继续比较,将次大数移至倒数第二.依此规律,直至比较结 ...
随机推荐
- javaSE第二十四天
第二十四天 363 1:多线程(理解) 363 (1)JDK5以后的Lock锁 363 A:定义 363 B:方法: 364 C:具体应用(以售票程序为例) 364 ...
- 使用HTML5构建下一代的Web Form
HTML语言作为如今编程最为广泛的语言,具有易用.快捷.多浏览平台兼容等特点,但是随着时代的进步,HTML的标准却停滞不前,这一次还在不断开发中的[color=#444444 !important]H ...
- ChainOfResponsibility
#include <iostream> using namespace std; class Chain { public: bool Handle() { return false; } ...
- 使用userdel命令删除Linux用户
serdel是什么 userdel 是一个底层用于删除用户的工具.在 Debian 上,我们通常会使用 deluser 命令.userdel 会查询系统账户文件,例如 /etc/password 和 ...
- mysql 排重查询
GROUP BY 语句可以实现某一列的去重查询. 直接上语句: select io_dev_id from io_info where (TID=1 AND host_name='yang1') GR ...
- Eclipse插件推荐:UCDetector: Unnecessary Code Detector
正如其名,检查不必要的代码. 下载地址为:http://sourceforge.net/projects/ucdetector/files/latest/download?source=files 官 ...
- VCL主要框架
TObject ->TPersistent Classes,抽象类 ->TComponent Classes,抽象类 ->TControl Controls ->TGra ...
- Hadoop伪分布式搭建CentOS
所需软件及版本: jdk-7u80-linux-x64.tar.gz hadoop-2.6.0.tar.gz 1.安装JDK Hadoop 在需在JDK下运行,注意JDK最好使用Oracle的否则可能 ...
- linux命令行下的ftp 多文件下载和目录下载(转)
目标ftp服务器是一个非标准端口的ftp 1.通过shell登录 #ftp //shell下输入ftp命令,进入到ftp提示符 >open IP PORT //IP ,PORT对 ...
- MIFARE系列7《安全性》
飞利浦的MIFARE卡由于它的高安全性在市场上得到广泛应用,比如我们乘车用的公交卡,学校和企业食堂的饭卡等等.它每个扇区有独立的密匙(6个字节的密码),在通信过程中首先要验证密匙才能读写数据.它的关键 ...