C语言程序设计之高精度加法

运算因子超出了整型、实型能表示的范围,肯定不能直接用一个数的形式来表示。
能表示多个数的数据类型常用的有两种:数组和字符串。
数组:每个数组元素存储1位(在优化时,这里是一个重点!),有多少位就需要多少个数组元素;
用数组表示数的优点:每一位都是数的形式,可以直接加减;运算时非常方便。
用数组表示数的缺点:数组不能直接输入;输入时每两位数之间必须有分隔符,不符合数值的输入习惯;
字符串:String型字符串的最大长度是255,可以表示255位。
用字符串表示数的优点:能直接输入输出,输入时,每两位数之间不必分隔符,符合数值的输入习惯;
用字符串表示数的缺点:字符串中的每一位是一个字符,不能直接进行运算,必须先将它转化为数值再进行运算;运算时非常不方便;
综合以上所述,对上面两种数据结构取长补短:用字符串读入数据,用数组存储数据:

思想过程:
(1)运算顺序:两个数靠右对齐;从低位向高位运算;先计算低位再计算高位;
(2)运算规则:同一位的两个数相加再加上从低位来的进位,成为该位的和;这个和去掉向高位的进位就成为该位的值;如上例:3+8+1=12,向前一位进1,本位的值是2;可借助Mod(%)、Div(/)运算完成这一步;
(3)最后一位的进位:如果完成两个数的相加后,进位位值不为0,则应添加一位;
(4)如果两个加数位数不一样多,则按位数多的一个进行计算;

#include<stdio.h>
#include<string.h>
int main()
{
 char s1[100],s2[100];
 int t1,t2,t,i,d,a[100],b[100],c[100];
 gets(s1); //输入一个超大整数
 gets(s2);//输入又一个超大整数
    t1=strlen(s1);
    t2=strlen(s2);
 for (i=1;i<=t1;i++)
  a[i]=(int)s1[t1-i]-48; //字符转换成数字 注意,建议采用倒着录入,方便加法最高位进位
 for (i=1;i<=t2;i++)
     b[i]=(int)s2[t2-i]-48;
 if (t1>t2) t=t1; //摆竖式,控制循环次数
 else t=t2;
 d=0;
 for (i=1;i<=t;i++)
 {
  c[i]=(a[i]+b[i]+d)%10;  //求该位
  d=(a[i]+b[i]+d)/10;    //算进位
 }
 if (d==1)  //最高位相加后有进位
 {
     c[t]=1;       //开辟一个新的最高位
  t=t+1;        
 }
 for (i=t;i>0;i--)    //逆向输出
     printf("%d",c[i]);
 return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值