大数据相加减

 
  • //相加   
  • char* AddNum(char* a,char* b)  
  • {  
  •     int maxlen = max(strlen(a),strlen(b));  
  •     //多申请两个字符,一个是结束符'/0',一个是放到第一个字符,当两个数最高位相加后,如果有进位,保存到这里  
  •     char* p = new char[maxlen+2];  
  •     //为最后一位写上结束符   
  •     *(p+maxlen+1)='/0';  
  •     //声明两个指针分别指向a和b的末尾,不包含结束符   
  •     char* pA=a+strlen(a)-1;  
  •     char* pB=b+strlen(b)-1;  
  •     int m=0;  
  •     int n=0;  
  •     //进位   
  •     int c=0;  
  •     for (int i=maxlen;i>0;i--)  
  •     {  
  •         m = n = 0;  
  •         //因为当pA到达第一个字符时,即pA=a时,也要进行计算,所以这里用(pA-1)来判断  
  •         //因为字符'0'的Asic是48,所以1就是49,要转成数字,就要减去48  
  •         if ((pA+1) != a)  
  •         {  
  •             m = *pA - 48;  
  •             pA--;  
  •         }  
  •         if ((pB+1) != b)  
  •         {  
  •             n = *pB - 48;  
  •             pB--;  
  •         }  
  •         //为p指针的第i个字符赋值   
  •         *(p+i) = (m+n+c) % 10 + 48;  
  •         //取得进位   
  •         c = (m+n+c) / 10;  
  •     }  
  •     *p = 48+c;    
  •     return p;  
  • }  
  • //相减   
  • char* SubNum(char* a,char* b)  
  • {  
  •     int maxlen = max(strlen(a),strlen(b));  
  •     //不考虑被减数最高位不够减的情况   
  •     char* p = new char[maxlen+1];  
  •     //为最后一位写上结束符   
  •     *(p+maxlen)='/0';  
  •     //声明两个指针分别指向a和b的末尾,不包含结束符   
  •     char* pA=a+strlen(a)-1;  
  •     char* pB=b+strlen(b)-1;  
  •     int m=0;  
  •     int n=0;  
  •     //借位位   
  •     int c=0;  
  •     for (int i=maxlen-1;i>=0;i--)  
  •     {  
  •         m = n = 0;  
  •         //因为当pA到达第一个字符时,即pA=a时,也要进行计算,所以这里用(pA-1)来判断  
  •         //因为字符'0'的Asic是48,所以1就是49,要转成数字,就要减去48  
  •         if ((pA+1) != a)  
  •         {  
  •             m = *pA - 48;  
  •             pA--;  
  •         }  
  •         if ((pB+1) != b)  
  •         {  
  •             n = *pB - 48;  
  •             pB--;  
  •         }  
  •         //不够减,要借位   
  •         if (m<n)  
  •         {  
  •             //为p指针的第i个字符赋值   
  •             *(p+i) = 10+m-n-c + 48;  
  •             c = 1;  
  •         }  
  •         else  
  •         {  
  •             //虽然够减,但是如果再算是借走的一位,那么就小于0了   
  •             if (m-n-c<0)  
  •                 *(p+i) = 10+m-n-c + 48;  
  •             else  
  •             {  
  •                 *(p+i) = m-n-c + 48;  
  •                 c = 0;  
  •             }  
  •         }  
  •     }  
  •     return p;  
  • }  
  • int main()  
  • {  
  •     char* a="75546666666666666666666666666663366667554666666666665676787667678666336666";  
  •     char* b="66666666666666666666666666666666666667554666666666666654656565675666336666";  
  •     char* p =AddNum(a,b);  
  •     printf("%s/n","两数相加等于:");  
  •     printf("%s/n",p);  
  •     p =SubNum(a,b);  
  •     printf("%s/n","两数相减等于:");  
  •     printf("%s/n",p);  
  •     return 0;  
  • }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值