求两个大整数相乘的积,数字长度在127个字符之内。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求两个大整数相乘的积,数字长度在127个字符之内。相关的知识,希望对你有一定的参考价值。
计算两个大整数相乘的结果,数字不是double类型能表示的,数字长度没有限制(最大127位)。
方法一:使用java中的大整数处理库函数,java.math.BigInteger,java.math.BigDecimal;
方法二:不利用库函数,自己实现其功能,可以练习自己对待复杂问题的处理能力,提高编程水平。
此代码中利于两者的结合,利于库函数可以看自己编写的代码的正确性。
1、主函数
import java.math.BigDecimal; import java.util.Scanner; public class Big_multip { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int i=10; while(i>1){ System.out.print("输入第一个数:"); String s1=sc.next(); System.out.print("输入第二个数:"); String s2=sc.next(); String s4=send(s1,s2); System.out.println("计算结果是:"+s4); System.out.println("正确结果: "+ku_big(s1,s2)); --i; } sc.close(); };
2、对输入数据的第一步处理,分发处理代码
public static String send(String s1,String s2){ if(!(check(s1)&&check(s2))) return "输入有非法字符"; s1=take_head_zero(s1); s2=take_head_zero(s2); String str=multiply_first(s1,s2); str=take_head_zero(str); return str; };
3、处理相乘的第一步
public static String multiply_first(String s1,String s2){ int len2=s2.length(),a=0; String str="0"; for(int i=0;i<len2;++i) { a=s2.charAt(len2-1-i)-‘0‘; String sa=null; if(a!=0) { sa=multiply_one(s1,a); for(int j=0;j<i;++j) sa=sa+"0"; str=integer_add(sa,str); } } return str; };
4、计算纯数字字符串乘以每个数字(个位数字)的结果
public static String multiply_one(String s,int a){ int len=s.length(),k=0,before=0,kk=0; String str=""; for(int i=1;i<=len;++i) /*从最低位(即下标最大)处开始算*/ { k=(s.charAt(len-i)-‘0‘)*a+before; before=k/10; k=k%10; str=k+str; kk=1; } if(kk==0) str="0"; else if(before>0) str=before+str; return str; };
5、两个纯数字相加代码
public static String integer_add(String s1,String s2){ /*传递的时候已经确定第一个参数s1为最长字符串,s2为短字符串。*/ if(s1.length()<s2.length()) { String temp=s1; s1=s2; s2=temp; } int len1=s1.length(),len2=s2.length(); int a,temp=0; String str=""; for(int i=1;i<=len1;++i) /*注意开始i=1,结束时i==len1,因为前面i是从1开始,后面结束要多算一位*/ { if(i<=len2) a=temp+(s1.charAt(len1-i)-‘0‘)+(s2.charAt(len2-i)-‘0‘); else a=temp+(s1.charAt(len1-i)-‘0‘); temp=a/10; a=a%10; str=a+str; } if(temp!=0) str=temp+str; /*消除最前面的数字0*/ str=take_head_zero(str); return str; };
6、对于纯数字,剔除前面多余的零
/*剔除前面多余的数字0.*/ public static String take_head_zero(String s){ int len=s.length(),i=0; while(i<len) { if(s.charAt(i)==‘0‘) ++i; else break; } if(i<len) s=s.substring(i); else s="0"; return s; };
7、检查输入的字符串是否有非法的字符
public static boolean check(String s){ int k=0; for(int i=0;i<s.length();++i) { if(s.charAt(i)<=‘9‘&&s.charAt(i)>=‘0‘) { if(s.charAt(i)==‘.‘) { ++k; if(k>=2) return false; } } else return false; } return true; };
8、调用库函数就两个长纯数字的积,为了验证自己编写的代码计算结果是否正确。
public static String ku_big(String s1,String s2){ BigDecimal b1; BigDecimal b2; BigDecimal b=new BigDecimal("0"); try{ b1=new BigDecimal(s1); b2=new BigDecimal(s2); b=b1.multiply(b2); }catch(NumberFormatException e){ //System.out.println(e); return "输入有非法字符"; } return b.toString(); };
999、下面是整个程序的完整代码(此代码仅仅参考,若有bug希望共勉。)
/*两个长数字相乘*/ import java.math.BigDecimal; import java.util.Scanner; public class Big_multip { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int i=10; while(i>1){ System.out.print("输入第一个数:"); String s1=sc.next(); System.out.print("输入第二个数:"); String s2=sc.next(); String s4=send(s1,s2); System.out.println("计算结果是:"+s4); System.out.println("正确结果: "+ku_big(s1,s2)); --i; } sc.close(); }; public static String send(String s1,String s2){ if(!(check(s1)&&check(s2))) return "输入有非法字符"; s1=take_head_zero(s1); s2=take_head_zero(s2); String str=multiply_first(s1,s2); str=take_head_zero(str); return str; }; public static String multiply_first(String s1,String s2){ int len2=s2.length(),a=0; String str="0"; for(int i=0;i<len2;++i) { a=s2.charAt(len2-1-i)-‘0‘; String sa=null; if(a!=0) { sa=multiply_one(s1,a); for(int j=0;j<i;++j) sa=sa+"0"; str=integer_add(sa,str); } } return str; }; public static String multiply_one(String s,int a){ int len=s.length(),k=0,before=0,kk=0; String str=""; for(int i=1;i<=len;++i) /*从最低位(即下标最大)处开始算*/ { k=(s.charAt(len-i)-‘0‘)*a+before; before=k/10; k=k%10; str=k+str; kk=1; } if(kk==0) str="0"; else if(before>0) str=before+str; return str; }; public static String integer_add(String s1,String s2){ /*传递的时候已经确定第一个参数s1为最长字符串,s2为短字符串。*/ if(s1.length()<s2.length()) { String temp=s1; s1=s2; s2=temp; } int len1=s1.length(),len2=s2.length(); int a,temp=0; String str=""; for(int i=1;i<=len1;++i) /*注意开始i=1,结束时i==len1,因为前面i是从1开始,后面结束要多算一位*/ { if(i<=len2) a=temp+(s1.charAt(len1-i)-‘0‘)+(s2.charAt(len2-i)-‘0‘); else a=temp+(s1.charAt(len1-i)-‘0‘); temp=a/10; a=a%10; str=a+str; } if(temp!=0) str=temp+str; /*消除最前面的数字0*/ str=take_head_zero(str); return str; }; /*剔除前面多余的数字0.*/ public static String take_head_zero(String s){ int len=s.length(),i=0; while(i<len) { if(s.charAt(i)==‘0‘) ++i; else break; } if(i<len) s=s.substring(i); else s="0"; return s; }; public static boolean check(String s){ int k=0; for(int i=0;i<s.length();++i) { if(s.charAt(i)<=‘9‘&&s.charAt(i)>=‘0‘) { if(s.charAt(i)==‘.‘) { ++k; if(k>=2) return false; } } else return false; } return true; }; public static String ku_big(String s1,String s2){ BigDecimal b1; BigDecimal b2; BigDecimal b=new BigDecimal("0"); try{ b1=new BigDecimal(s1); b2=new BigDecimal(s2); b=b1.multiply(b2); }catch(NumberFormatException e){ //System.out.println(e); return "输入有非法字符"; } return b.toString(); }; }
以上是关于求两个大整数相乘的积,数字长度在127个字符之内。的主要内容,如果未能解决你的问题,请参考以下文章