zoukankan      html  css  js  c++  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 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();
    };
    
    }
  • 相关阅读:
    c++笔试题3
    C++笔试题
    C++编程指南续(10-11)
    C++详解(8-9)
    C++编程指南(6-7)
    C++编程指南续(4-5)
    C++编程指南续
    C++的编程指南
    HPSocket介绍与使用
    WinForm中TreeView控件实现鼠标拖动节点(可实现同级节点位置互换,或拖到目标子节点)
  • 原文地址:https://www.cnblogs.com/duange/p/5998424.html
Copyright © 2011-2022 走看看