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());
    		}
    	}
    }
    
  • 相关阅读:
    A query was run and no Result Maps were found for the Mapped Statement 'com.demo.dao.UserDao.check'. It's likely that neither a Result Type nor a Result Map was specified.
    layui监听input内容变动简单粗暴
    Java多线程中
    Java 对象内存分析
    MySQL重做日志
    并查集-Java实现
    java虚拟机类加载机制
    Java的23种设计模式概述
    redo log 有什么作用?
    什么是redo log ?
  • 原文地址:https://www.cnblogs.com/scottding/p/3661402.html
Copyright © 2011-2022 走看看