zoukankan      html  css  js  c++  java
  • 大整数操作

    数据类型 长度(位) 取值范围
    char 8 ASCII字符
    short 8 -128 ~ 127
    int  16 -32768 ~ 32767
    long 32 -2147483648 ~ 2147483647
    float 32 -3.4e-38 ~ 3.4e+38
    double 64 1.7e-308 ~ 1.7e+308
    注:表中的长度和范围的取值是假定CPU字长为16位。

    问题解析:

    如上表所示,long型数据最大能对21亿以内的数字操作,可是如果两个100亿的数字相加,或者相乘呢?long型肯定不能满足需求。如果是用在天文学的计算,数字更可能达到几十位,甚至是几百位的数字。这已经不可能再使用系统定义的数据类型了,那该怎么解决?

    主要思想:

    不管是大整数相加,还是大整数相乘,都可以把一个数字的各位数字存进一个数组里面,然后再对数组进行操作。就像小学时候的列竖式做加法或者乘法一样。


    具体例题:

    (大数相加)
    /*******
    a和b存放要相加的两个数的逆序,c将存放逆序的和,l为两个加数位数取最大值。
    例如320+427:a={0,2,3},b={7,2,4},l=3,计算结果c={7,4,7}。
    *******/
    int Adding(int a[],int b[],int c[],int l)
    {
    	int i,t;
    	for(i=0;i<l;i++)
    	{
    		t=a[i]+b[i]+c[i];
    		c[i]=t%10;
    		c[i+1]=t/10;///////////进位
    	}
    	if(c[i]!=0)
    		return i+1;
    	return i;///////////////////函数返回数组c的长度
    }

    (大数相乘)
    <span style="font-size:18px;">/******* 
    a和b存放要相乘的两个数的逆序,c将存放逆序的积,la、lb分别为两个乘数的位数。 
    例如315*66:a={5,1,3},b={6,6},la=3,lb=2,计算结果c={0,9,7,0,2}。 
    *******/ 
    int Multiply(int a[],int b[],int c[],int la,int lb)
    {
    	int i,j,t;
    	for(i=0;i<lb;i++)
    		for(j=0;j<la;j++)
    		{
    			t=a[j]*b[i]+c[i+j];
    			c[i+j]=t%10;
    			c[i+j+1]+=t/10;////////////进位
    		}
    	if(c[la+lb-1]!=0)
    		return la+lb;
    	return la+lb-1;////////////////////函数返回乘积的位数
    }</span>



    — —PS:
    第一篇博客,格式不会编排,不免有些丑,见谅!
    如果有什么建议或者意见,请尽量提出。有什么问题也可以在下面提出。
    不断地改错是最快的成长方式,谢谢!

  • 相关阅读:
    WCF 第二章 契约
    WCF 第二章 契约 两个单向契约VS一个双向契约
    WCF 第二章 契约 数据契约等效
    WCF 第二章 契约 双向操作
    WCF 第二章 契约 服务契约
    Java环境变量配置(Mac)
    java使用document解析xml文件
    使用JDOM解析xml文档
    使用SAX解析xml文档
    sharepoint 2007服务器场迁移到 64 位环境 ^
  • 原文地址:https://www.cnblogs.com/Bone-ACE/p/4531311.html
Copyright © 2011-2022 走看看