HDU1002 A + B Problem II

A - A + B Problem II

 HDU - 1002

Sample Input

2
1 2
112233445566778899 998877665544332211

Sample Output

Case 1:
1 + 2 = 3

Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110

这道题我本来是不会做的,看了别人的代码慢慢理解才会做的。

考点:简单的大数相加问题

思路:当要表示的数据超出计算机所使用的数据表示范围时,此时就会产生数据的溢出,这就是常见的大数问题。在java中有专门的大数计算方法。但在c c++中处理大数问题比较麻烦。首先大数储存在字符串数组中,用字符串的方式保存大数的每一位。然后将字符型转换为数字型。

注意点:1.字符型转换为数字型 遍历数组对每一位减‘0’得到对应的整数值。

2.存储数字时采用倒序方式存储。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
char str1[100];
char str2[100];
int a[100],b[100],c[100];
int main()
{
  int n,cnt=1,m;
  cin>>n;
  m=n;
  while(n--)
  {
    int u=0;
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    cin>>str1>>str2;
    int len1=strlen(str1);
    int len2=strlen(str2);
    for(int i=len1-1,j=0;i>=0;i--,j++)
    {
      a[j]=str1[i]-'0';
    }
    for(int i=len2-1,j=0;i>=0;i--,j++)
    {
      b[j]=str2[i]-'0';
      //cout<<b[j];
    }
    int len3=len1>len2?len1:len2;
    for(int i=0;i<=len3;i++)
    {
      c[i]=a[i]+b[i]+u;
      u=c[i]/10;
      c[i]=c[i]%10;
      cout<<c[i]<<endl;
    }
    for(int i=len3;i>=0;i--)
      if(c[i]!=0)
      {
        len3=i;
        break;
      }
    printf("Case %d:\n%s + %s = ",cnt++,str1,str2);
    for(int i=len3;i>=0;i--)
    {
      printf("%d",c[i]);
    }
    printf("\n");
    if(cnt<=m)
    {
      printf("\n");
    }
  }
  return 0;
}

for(int i=0;i<=len3;i++)
    {
      c[i]=a[i]+b[i]+u;
      u=c[i]/10;
      c[i]=c[i]%10;
      cout<<c[i]<<endl;
    }这是代码的关键也是难点,反正我是看了好几遍才想通。u变量是为了进位。c[i]是把每一位相加。

这是运行结果,其实大数相加就是模板题,会用java是最好的。不会用模板思路多写几遍就会了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值