高精度算法

加法

#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
char num1[1002], num2[1002];
char* add(char* s1, char* s2)
{
 char* longer,//相比之下的长串
  * shorter;//相比之下的短串
 int i, j, k, p;
 int len1 = strlen(s1), len2 = strlen(s2);
 if (len1 > len2)
 {
  longer = s1;
  shorter = s2;
 }
 else
 {
  longer = s2;
  shorter = s1;
 }
 j = strlen(longer);
 k = strlen(shorter);
 //判断谁是长串短串,然后对短串进行处理
 p = j - k;//串长差值;
 for (i = j; k > 0; i--)
 {
  shorter[i - 1] = shorter[k - 1];
  k--;
 }
 for (i = p; i > 0; i--)
  shorter[i - 1] = '0';//这里改了下,i不能>=0;不然串长相同时shorter[0]给杨咯(1+2=2)
 //把因为挪后面移动的位用'0'覆盖填充,方便以后计算
 k = 0;//表示进位
 j = strlen(longer);
 for (i = j - 1; i >= 0; i--)
 {
  longer[i] = longer[i] + shorter[i] - 2 * '0' + k;//加法需要减2个‘0’字符,减掉多余的ascii
  if (longer[i] / 10)//大于10,需要进位
  {
   k = 1;//进位符号标记
   longer[i] %= 10;
  }
  else
   k = 0;
  longer[i] += '0';//从数字变成字符
 }
 j = strlen(longer);
 if (k == 1)//看看最大位进不进位
 {
  for (i = j; i > 0; i--)//第一位有进位,其实更好的办法是吧第0号元素空着,可以省下这一步
  {
   longer[i] = longer[i - 1];//
  }
  longer[0] = '1';//最前面一位变成0
 }
 return longer;
}
int main()
{
 int time, i;
 cin >> time;
 for (i = 1; i <= time; i++)
 {
  cin >> num1;
  cin >> num2;
  cout << "Case " << i << ":" << endl;
  cout << num1 << " + " << num2 << " = ";
  cout << add(num1, num2) << endl;
  if (i != time)
   cout << "\n";
  memset(num1, 0, sizeof(num1));//清空数组
  memset(num2, 0, sizeof(num2));
 }
 return 0;
}

1、先找出位数多的数

2、然后把短串的最后一位平移到长串的最后一位

3、记得把前面空出来的位置变成’0’字符,定义数组的时候最好把下标0空出来防备进位

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值