zoukankan      html  css  js  c++  java
  • 大数处理之一(加法和乘法)

    今天看了两个大数处理的程序,一个是用JAVA 写的,一个是用C写的,处理的确实是挺方便的,虽然现在还没有学JAVA,但看起来感觉很强大,下面把JAVA 代码贴出来,学习一下:

    import java.math.BigInteger;
    import java.util.Scanner;
    
    class Main {
    	public static void main(String args[]) {
    		Scanner s = new Scanner(System.in);
    		BigInteger zero = BigInteger.valueOf(0);
    		BigInteger sum = BigInteger.valueOf(0);
    		for(;;) {
    			BigInteger b = s.nextBigInteger();
    			if(b.equals(zero)) break;
    			sum = sum.add(b);
    		}
    		System.out.println(sum.toString());
    	}
    }
    

     短短几行就把这个问题解决了;

    下面介绍一下如何使用C来解决大数问题:

    大数长度最长为 L ;

    定义一个字符数组  s[ L ] ;

    定义一个整形数组 a[ L ] ;

    定义一个求和的数组 sum[ L ] ;

    输入大数到 字符数组 S 中 ,从 S 的最后一个字符开始 把 S[ len - 1 ] - '0' 赋值给 a[ 0 ] ,这样循环下去,使得S中的字符变成整型,并倒续存入整型数组a中,让a中的每个数值与相应的sum中的每个字符相加,和存入sum中;

    对sum进行处理,sum[k+1] += sum[k] / 10 ;    sum[k] = sum[k] % 10 ;

    倒续输出sum中的数值(前序为0的除外)

    详细代码如下:

    #include<iostream>
    #include<string>
    #include<stdio.h>
    #include<string.h>
    using namespace std ;
    int main()      {
            char s[100] ;
            int sum[101] = {0} ;
            while(cin >> s && strcmp(s,"0"))        {
                    int a[101] = {0} ;
                    int len = strlen(s) ;
                    int t = 100 ;
                    for(int i = len - 1 ; i >= 0 ; i--)
                            a[t--] = s[i] - '0' ;
                    for(int j = 100 ; j >= 0 ; j--)
                            sum[j] += a[j] ;
                    for(int k = 100 ; k>= 1; k--)   {
                            sum[k-1] += sum[k] / 10 ;
                            sum[k] = sum[k] % 10 ;
                    }
            }
            int start = 0 ;
            while(start <= 99 && !sum[start])
                    start++ ;
            while(start<=100)
                    cout << sum[start++] ;
            cout << endl ;
            return 0 ;
    }
    

     上面只是大数相加,如果存在大数相乘,该如何处理呢?能不能用相同的方法解决?

    举个例子  123 * 12 我们应该怎样用上述方法实现呢?

    123

    * 12定义一个数组为 sum[5] ;

    sum[4] = 2 * 3 ;

    sum[3] = 2 * 2 ;

    sum[2] = 2 * 1 ;

    sum[1] = 0 ;

    sum[0] = 0 ;

    sum[4] = sum[4] + 1 * 3 ;

    sum[3] = sum[3] + 1 * 2 ;

    sum[2] = sum[2] + 1 * 1 ;

    sum[1] = sum[1] + 0 ;

    sum[0] = sum[0] + 0 ;

    这样就把 sum 数组给确定了;

    再运用上面的方法即可解决此题;

    思维决定程序的效率 啊 !!!

    下面给出相应的代码 :

    #include<iostream>
    #include<string>
    #include<string.h>
    
    using namespace std ;
    
    int main()      {
            char s1[1000] , s2[1000] ;
            while(cin >> s1 >> s2)  {
            int sum[1001] = {0} ;
                    int len1 = strlen(s1) ;
                    int len2 = strlen(s2) ;
                    for(int i = len2 - 1 ; i >= 0 ; i--)
                            for(int j = len1 - 1 , p = 1000 - (len2 - 1 - i) ; j >= 0 ; j--)
                                    sum[p--] += ( (s2[i] - '0') * (s1[j] - '0') ) ;
                    for(int k = 1000 ; k >= 0 ; k--)        {
                            sum[k-1] += sum[k] / 10 ;
                            sum[k] = sum[k] % 10 ;
                    }
                    int start = 0 ;
                    while(start <= 999 && !sum[start])
                            start++ ;
                    while(start <= 1000)
                            cout << sum[start++] ;
                    cout << endl ;
            }
            return 0 ;
    }
    

     同时可以用JAVA来实现,肯定是方便多了:

    import java.util.Scanner;
    import java.math.BigInteger;
    
    class Main {
    	public static void main(String args[]) {
    		Scanner in = new Scanner(System.in);
    		while(in.hasNext()) {
    			BigInteger a = in.nextBigInteger();
    			BigInteger b = in.nextBigInteger();
    			System.out.println(a.multiply(b).toString());
    		}
    	}
    }
    
  • 相关阅读:
    HDU 6143 Killer Names【dp递推】【好题】【思维题】【阅读题】
    HDU 6143 Killer Names【dp递推】【好题】【思维题】【阅读题】
    POJ 3974 Palindrome【manacher】【模板题】【模板】
    POJ 3974 Palindrome【manacher】【模板题】【模板】
    HDU 6127 Hard challenge【计算机几何】【思维题】
    HDU 6127 Hard challenge【计算机几何】【思维题】
    HDU 6129 Just do it【杨辉三角】【思维题】【好题】
    HDU 6129 Just do it【杨辉三角】【思维题】【好题】
    HDU 3037 Saving Beans【Lucas定理】【模板题】【模板】【组合数取余】
    8.Math 对象
  • 原文地址:https://www.cnblogs.com/NYNU-ACM/p/4237446.html
Copyright © 2011-2022 走看看