java求一组整数中的正数之积_求两个大整数相乘的积,数字长度在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 staticString 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);returnstr;

};

3、处理相乘的第一步

public staticString multiply_first(String s1,String s2){int len2=s2.length(),a=0;

String str="0";for(int i=0;i

{

a=s2.charAt(len2-1-i)-'0';

String sa=null;if(a!=0)

{

sa=multiply_one(s1,a);for(int j=0;j

sa=sa+"0";

str=integer_add(sa,str);

}

}returnstr;

};

4、计算纯数字字符串乘以每个数字(个位数字)的结果

public static String multiply_one(String s,inta){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;returnstr;

};

5、两个纯数字相加代码

public staticString integer_add(String s1,String s2){/*传递的时候已经确定第一个参数s1为最长字符串,s2为短字符串。*/

if(s1.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');elsea=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);returnstr;

};

6、对于纯数字,剔除前面多余的零

/*剔除前面多余的数字0.*/

public staticString take_head_zero(String s){int len=s.length(),i=0;while(i

{if(s.charAt(i)=='0')++i;else

break;

}if(i

s=s.substring(i);elses="0";returns;

};

7、检查输入的字符串是否有非法的字符

public static booleancheck(String s){int k=0;for(int i=0;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 staticString ku_big(String s1,String s2){

BigDecimal b1;

BigDecimal b2;

BigDecimal b=new BigDecimal("0");try{

b1=newBigDecimal(s1);

b2=newBigDecimal(s2);

b=b1.multiply(b2);

}catch(NumberFormatException e){//System.out.println(e);

return "输入有非法字符";

}returnb.toString();

};

999、下面是整个程序的完整代码(此代码仅仅参考,若有bug希望共勉。)

/*两个长数字相乘*/

importjava.math.BigDecimal;importjava.util.Scanner;public classBig_multip {public static voidmain(String[] args) {

Scanner sc=newScanner(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 staticString 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);returnstr;

};public staticString multiply_first(String s1,String s2){int len2=s2.length(),a=0;

String str="0";for(int i=0;i

{

a=s2.charAt(len2-1-i)-'0';

String sa=null;if(a!=0)

{

sa=multiply_one(s1,a);for(int j=0;j

sa=sa+"0";

str=integer_add(sa,str);

}

}returnstr;

};public static String multiply_one(String s,inta){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;returnstr;

};public staticString integer_add(String s1,String s2){/*传递的时候已经确定第一个参数s1为最长字符串,s2为短字符串。*/

if(s1.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');elsea=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);returnstr;

};/*剔除前面多余的数字0.*/

public staticString take_head_zero(String s){int len=s.length(),i=0;while(i

{if(s.charAt(i)=='0')++i;else

break;

}if(i

s=s.substring(i);elses="0";returns;

};public static booleancheck(String s){int k=0;for(int i=0;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 staticString ku_big(String s1,String s2){

BigDecimal b1;

BigDecimal b2;

BigDecimal b=new BigDecimal("0");try{

b1=newBigDecimal(s1);

b2=newBigDecimal(s2);

b=b1.multiply(b2);

}catch(NumberFormatException e){//System.out.println(e);

return "输入有非法字符";

}returnb.toString();

};

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值