两个超大数的相加

 #include "stdafx.h"
//#include <malloc.h>
#define N 200    //预定一个比较长的长度值

int slen(char a[])  //计算加数的长度
{
 int i=0;
 for(;;i++)
 {
  if(a[i]=='/0') return i;
 }
}

int tonum(char a)  //字符转数字
{
 return (a-48);
}
//
int _tmain(int argc, _TCHAR* argv[])
{
 //int len,i,up=0;                                       // 
 //printf("请输入两个加数最大数的位数:");                //                                                          //
 //scanf("%d",&len);                                     //              第一次尝试                                  //
 分配内存                                            //              但没有成功                                  //
 //char *add1,*add2,*and;                                //              后来发现是个简单的问题                      //
 //add1=(char *)malloc(len*sizeof(char));                //                                                          //
 //add2=(char *)malloc(len*sizeof(char));                //                                                          //
 //and=(char *)malloc((len+1)*sizeof(char));             //                                                          //
 //scanf("%s%s",add1,add2);                              //                                                          //
 //i=len;                                                //                                                          //
 //for(i=len;i>=0;i--)                                   //                                                          //
 //{                                                     //                                                          //
 // and[i]=(add1[i]+add2[i]-96)%10+48+up;               //                                                          //
 // if((add1[i]+add2[i]-96)/10==1) up=1;                //                                                          //
 // else up=0;                                          //                                                          //
 //}                                                     //                                                          //
 //printf("%s",and);                                     //
/
 for(;;){
 char ad1[N]={},ad2[N]={},sum[N+1]={};    //定义两个字符长数组,ad1和ad2分别是两加数,sum是结果

 scanf("%s%s",ad1,ad2);    //输入两个加数

 int i=slen(ad1),j=slen(ad2);    //分别算出两个加数的长度

 int n=((i>j)?i:j)+1,up=0;    //用n来代表结果的长度(比最长的加数多一位)

 int len=n;    //用于限制后面结果输出的范围

 for (--n,--i,--j;i>=0 && j>=0;n--,i--,j--)    //把加数每个字符相加的结果存到sum对应的位置
 {
  sum[n]=(tonum(ad1[i])+tonum(ad2[j]))%10+48+up;

  if((tonum(ad1[i])+tonum(ad2[j]))/10==1) up=1;    //判断是否进位

  else up=0;

  if(sum[n]==58)   //判断是否刚好为0(因为ASCII中'0'是在'1'前,其ASCII值为58)
  {
   sum[n]='0';

   up=1;
  }   
 }
 if (i==j)    //如果i==j则说明以上的运算已经把除了sum[0]之外其它位的值确定好
 {
  if (up==1)   //处理当i==j时sum[0]的值

   sum[0]='1';

  else sum[0]='0';
 }
 else    //如果i!=j则要对长数和sum对应位进行处理
 {
  if(i>=0)  //处理当ad1的长度比ad2长的情况
  {
      for(;i>=0;i--,n--)

   {
    sum[n]=ad1[i]+up;
   
       if(sum[n]==58)  //处理进位
       {
        sum[n]='0';

        up=1;
       }
       else up=0;
       }
      }
      if(j>=0)    //处理当ad2的长度比ad1长的情况
      {
       for(;j>=0;j--,n--)

       {
     sum[n]=ad2[j]+up;

           if(sum[n]==58)  //处理进位
           {
            sum[n]='0';

            up=1;
            }
           else up=0;
       }
   }
      if(up==1) sum[0]='1';    //处理当i!=j时sum[0]的值
  
      else sum[0]='0';
 }
 if(sum[0]=='0') i=1;    //确定sum第一位是不是'0',如果是的话就不输出这个位
 
 else i=0;

 for(;i<len;i++)    //进行输出

 printf("%c",sum[i]);
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值