计算两个大整数相乘的结果,数字不是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();
};
}