大数运算——加法减法
http://www.cnblogs.com/leader/archive/2013/01/28/2880643.html 第一篇博文有点小鸡冻。在哈工程寒假集训中第一次模拟中唯一一道对我有价值的题就是大数加法,随后的几次模拟中大数运算不断,可见这是我们必须掌握的技能,本人智商较低,先讲解下大数加法减法,乘除阶乘或者结合其他知识的大数运算日后定会奉上。 究竟为什么要用大数加法呢。我们来看下数据: bool型为布尔型,占1个字节,取值0或1。 BOOL型为int型,一般认为占4个字节,取值TRUE/FALSE/ERROR。 sbyte型为有符号8位整数,占1个字节,取值范围在128~127之间。 bytet型为无符号16位整数,占2个字节,取值范围在0~255之间。 short型为有符号16位整数,占2个字节,取值范围在-32,768~32,767之间。 ushort型为无符号16位整数,占2个字节,取值范围在0~65,535之间。 int型为有符号32位整数,占4个字节,取值范围在-2,147,483,648~2,647之间。 uint型为无符号32位整数,占4个字节,取值范围在0~4,294,967,295之间。 long型为64位有符号整数,占8个字节,取值范围在9,223,372,036,854,775,808~9,807之间。 ulong型为64位无符号整数,占8个字节,取值范围在0~18,446,744,073,709,551,615之间。 float型为32位单精度实数,占4个字节,取值范围3.4E+10的负38次方~3.4E+10的38次方之间。 double型为64位实数,占8个字节,取值范围1.7E+10的负308次方~1.7E+10的正308次方。 ? ? ? ??所以999999999999999999999999999999999999999+888888888888888888888888888888888888888888888=? ? ? ? ? ? ? ? ? ?? 大数加法 ? ? ? ?基本思想:数组要多长有多长啊,随便定义个a[1000000],不就OK啦! ? ? ? ? ? ?我都能写出来,当然代码是非常简单了啦,我说下要注意的几个问题: 1.? ? ?判断最后数组的长度 ? ? 2. ? ? 去掉前导零 ? 1 void Add(char s1[],char s2[]) //需要两个字符串参数&&无返回值 2 { 3 int num1[M],nm2[M]; 4 int i,j; 5 len1=strlen(s1); 6 len2=strlen(s2); 7 for(i=len1-1,j=0;i>=0;i--)//num[0]保存的是低位 8 num1[j++]=s1[i]-'0'; 9 for(i=len2-1,j=0;i>=0;i--) 10 num2[j++]=s2[i]-'0'; 11 for(i=0;i<M;i++) 12 { 13 num1[i]+=num2[i]; 14 if(num1[i]>9) 15 { 16 num1[i]-=10; 17 num1[i+1]++; 18 } 19 } 20 21 for(i=M;(i>=0)&&(num1[i]==0);i--)//找到第一个不是零的数 22 { 23 if(i>=0) 24 for(;i>=0;i--) 25 printf("%d",num1[i]); 26 else 27 printf("0n") 28 }
? ?当然方法不止一种。如果说上面这个清晰的话,那下面这个应该是省了点内存。 1 void Add(char a[],char b[],char d[]) 2 { 3 char c[10001]; 4 int lena=strlen(a),lenb=strlen(b); 5 int i,j,len; 6 len=lena>lenb?lena:lenb; 7 len++; 8 c[0]=' |