
正文
大整数乘法代码java java计算大整数的阶乘
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
傅里叶变换如何解决大整数乘法? 希望能给出思路,最好能用JAVA语言描述一下,万分感谢
用BigInteger
给你个例子
import java.math.BigInteger;
public class Admin {
public static void main(String... args) {
BigInteger a = BigInteger.valueOf(Long.MAX_VALUE);
BigInteger b = BigInteger.valueOf(Long.MAX_VALUE);
System.out.println(a);
System.out.println(b);
// 加
System.out.println(a.add(b));
// 减
System.out.println(a.subtract(b));
// 乘
System.out.println(a.multiply(b));
// 除
System.out.println(a.divide(b));
}
}
相关问答
Q1: Java如何实现用户输入大整数转为乘以10的幂次方,例如:5*10^5
Java 科学计数法
1 科学计数法的概念
1.1 有效数字
在一个近似数中,从左边第一个不是0的数字起,到精确到的位数止,这中间的所有数字都叫做这个近似数的有效数字
例如:
890314000保留三位有效数字为8.90×10的8次方 (四舍)
839960000保留三位有效数字为8.40×10的8次方 (五入)
0.00934593保留三位有效数字为9.35×10的-3次方
1.2 E记号
大多数计算器及计算机程序用科学记数法显示非常大和非常小的结果。因为指数上标(例如1011)在屏幕上显示不方便,字母E或e通常是用来代表的十次幂(写作“×10b”),E或e之后的数字是它的指数;换句话说,任何两实数a和b(b应为整数),“aEb”所表示的值是a × 10b。注意,这种用法中字母e不是数学常数e,也不是指数函数exp()(采用用大写字母E显示可以更大程度地避免误解);尽管它也表示指数,但这个符号通常被称为(科学计数法)E或e符号,而不是指数中的底数符号(尽管后者也会出现)。在正式的出版物中尽量不要使用这种显示方法。
注意科学记数法中的e或E与数学常数e或函数exp没有关系。
这种写法是因为一些计算机程序中不方便写上标而产生的,在正式出版物中不应当使用这种写法。
我国国家标准中科学计数法均用a ×10b的形式表示,而不是aEb(参见GB3101-1993,GBT15835-2011,GBT8170-2008)。
2 Java中的科学计数法
在Java中,当Double的取值符合某条件时,将会以科学计数法的方式显示(下面是个人测试的结果,非从文档中得到的结论):
@Testpublic void testPrintScientificNotation() { //整数部分位数大于等于8时开始以科学计数法显示
System.out.println(-12345678.0);
System.out.println(12345678.0); //整数位为0,当小数位以0开始连续出现大于等于3时开始以科学计数法显示
System.out.println(0.0001);
System.out.println(-0.0001);
}
结果
-1.2345678E71.2345678E71.0E-4-1.0E-4
很多时候,我们需要做一个统一,要么全部以科学计数法输出,要么就全部显示为普通计数。
根据网上的资料,主要提及NumberFormat、DecimalFormat、BigDecimal这三种API实现方式。
2.1 NumberFormat
NumberFormat 是所有数值格式的抽象基类。
public static String scientificNotation2String(Double d, int newValue) {
String value = null;
NumberFormat nf = NumberFormat.getInstance(); // 设置此格式中不使用分组
nf.setGroupingUsed(false); // 设置数的小数部分所允许的最大位数。
nf.setMaximumFractionDigits(newValue); value = nf.format(d); return value;
}
如果输入的小数位数,大于设定的最大的小数位数,则会进行四舍五入。
2.2 DecimalFormat
DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。该类设计有各种功能,使其能够解析和格式化任意语言环境中的数,包括对西方语言、阿拉伯语和印度语数字的支持。它还支持不同类型的数,包括整数 (123)、定点数 (123.4)、科学记数法表示的数 (1.23E4)、百分数 (12%) 和金额 ($123)。所有这些内容都可以本地化。
public static String scientificNotation2String(Double d) {
String value = null;
DecimalFormat decimalFormat = new DecimalFormat("0.00");//格式化设置
value = decimalFormat.format(d); return value;
}
需要设置模版,指定小数保留的位数,传入数值小数位数超出指定位数,则会进行四舍五入;传入数值小数位不足指定位数,则可以设置补零。
需要将数值转换为科学计数法只须将模版修改即可,例如将模版修改为:0.##E0
2.3 BigDecimal
BigDecimal是不可变的、任意精度的有符号十进制数。
public static String scientificNotation2String(String str) {
String value = null;
BigDecimal bd = new BigDecimal(str); value = bd.toPlainString(); return value;
}
BigDecimal的构造方法很多,不一定是要传入String类型的值。
BigDecimal中的toString方法和toPlanString方法的区别:
toString():返回此BigDecimal的字符串表示形式,如果需要指数,则使用科学计数法
toPlainString():返回不带指数字段的此BigDecimal的字符传表示形式
Q2: 如何在JAVA中,输入两个很大的数字使他们相乘后,得到正确结果结果?
像LZ说的这种计算在实际应用中是常用的.特别是在加密、解密过程中。这个问题的本身就是一个很大的课题。单纯用传统的方式会由于溢出而导致计算结果不正确。目前,针对这一应用,市面上、开源软件中都有一些针对这种运算的函数数,称作大数运算库。我们如果只是为了写应用,而不研究数值计算的话,直接采用这些库就行了。具体的大数运算的库可以上网搜一下。提供一个大数运算的示例程序:
Q3: java两个大整数相乘的 算法怎么写
有BigInteger这个类,你可以参数,如果需要自己写,应该是用字符串来处理。
import java.math.BigInteger;
public class TT {
public static void main(String[] args) {
BigInteger i1 = new BigInteger("122222222222222222222222222222222");
BigInteger i2 = new BigInteger("33333333333333333333333333333333");
BigInteger result = i1.multiply(i2);
System.out.println(result.toString());
}
}
Q4: Java实现两个无限大的数的加减乘除运算
根据你的要求,我写了一下代码,如下:package com.fer2005.test;public class AddUtil { /**
* @param a1 大数字1,按数组存储
* @param a2 大数字2,按数组存储
* @return 返回结果数组
*/
public int[] getResult(int[] a1,int[] a2){
//取最大的长度作为返回结果的长度,此时未考虑是否有进位
int length=a1.lengtha2.length?a1.length:a2.length;
//新建未考虑进位的数组结果
int[] tmp_res =new int[length];
int i=0;
//循环相加得到res的按照最短数组相加的结果
while(ia1.lengthia2.length){
i++;
tmp_res[length-i]=a1[a1.length-i]+a2[a2.length-i];
}
//操作完成后,需将长数组的值赋给res
//a1的长度说明a1比a2长度小,res需要获取a2的前几位
if(a1.lengtha2.length){
while(length-i0){
tmp_res[length-i-1]=a2[a2.length-i-1];
i++;
}
}else if(a1.lengtha2.length){
//说明a2比a1长度小,res需要获取a1的前几位
while(length-i0){
tmp_res[length-i-1]=a1[a1.length-i-1];
i++;
}
} //考虑进位问题,如果某一元素大于10,则本身减10,前一元素加1,如果第一个元素大于10,特殊处理。
//需处理相加之和大于10的情况
for(int k=tmp_res.length-1;k0;k--){
if(tmp_res[k]=10){
tmp_res[k-1]=tmp_res[k-1]+1;
tmp_res[k]=tmp_res[k]-10;
}
}
int[] res=new int[length+1];
//首位情况特殊处理
if(tmp_res[0]=10){
res[0]=1;
res[1]=tmp_res[0]-10;
for(int m=1;mtmp_res.length;m++){
res[m+1]=tmp_res[m];
}else{ res=tmp_res; }
}
return res;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
AddUtil addUtil = new AddUtil();
int[] a1= {9,2,3,8,5};
int[] a2={1,9,2,3,9};
for(int j:addUtil.getResult(a1, a2)){
System.out.print(j+",");
}
}}
大整数乘法代码java的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java计算大整数的阶乘、大整数乘法代码java的信息别忘了在本站进行查找喔。






