当前位置:编程学习 > C/C++ >>

wikioi 3116 高精度练习之加法

题目描述 Description
给出两个正整数A和B,计算A+B的值。保证A和B的位数不超过500位。
输入描述 Input Description
读入两个用空格隔开的正整数
输出描述 Output Description
输出A+B的值
样例输入 Sample Input
3 12
样例输出 Sample Output
15
数据范围及提示 Data Size & Hint
两个正整数的位数不超过500位
下面三种方法有细微的差别:
 
第一种方法:顺序读入字符串:
[cpp]  
#include <iostream>  
#include <string>  
#include <sstream>  
#include <cstring>  
using namespace std;  
  
int main()  
{  
  char a[501],b[501],c[502];  
  memset(a, '0', sizeof(a));  
  memset(b, '0', sizeof(b));  
  memset(c, '0', sizeof(c));  
  cin >> a >> b;  
  int aLen = 0;  
  int bLen = 0;  
  for(int k=0; k<501; k++)  
  {  
    if(a[k]=='\0')   
    {  
      aLen = k;  
      break;  
    }  
  }  
  for(int k=0; k<501; k++)  
  {  
    if(b[k]=='\0')   
    {  
      bLen = k;  
      break;  
    }  
  }  
    
  int i=aLen-1, j=bLen-1, k=501;  
  int carry = 0;  
  while(i>=0 && j>=0)  
  {  
    int cc = (a[i]-'0')+(b[j]-'0')+carry;  
    carry = cc/10;  
    cc%=10;  
    c[k] = cc+'0';  
    i--;  
    j--;  
    k--;  
  }  
  while(i>=0)  
  {  
    int cc = (a[i]-'0')+carry;  
    carry = cc/10;  
    cc%=10;  
    c[k] = cc+'0';  
    i--;  
    k--;  
  }  
  while(j>=0)  
  {  
    int cc = (b[j]-'0')+carry;  
    carry = cc/10;  
    cc%=10;  
    c[k] = cc+'0';  
    j--;  
    k--;  
  }  
  if(carry > 0) c[k] = carry;  
  for(j=0; j<502; j++)  
    if(c[j]-'0' > 0) break;  
  for(; j<502; j++)  
    cout << c[j];  
}  
 
第二种方法:逆序字符串:
 
[cpp] 
#include <iostream>  
#include <cstring>  
using namespace std;  
  
int main()  
{  
  char x[555],y[555];  
  int a[555]={0},b[555]={0},c[555]={0};  
  cin >> x >> y;  
  int len_x = strlen(x);  
  int len_y = strlen(y);  
  for(int k=0; k<len_x; k++)  
  {  
    a[k]=x[len_x-1-k]-'0';  
  }  
  for(int k=0; k<len_y; k++)  
  {  
    b[k]=y[len_y-1-k]-'0';  
  }  
  int len_max = len_x>len_y?len_x:len_y;  
  int carry = 0;  
  for(int i=0; i<len_max; i++)  
  {  
    c[i]=(a[i]+b[i]+carry)%10;  
    carry=(a[i]+b[i]+carry)/10;  
  }  
    
  if(carry > 0) c[len_max] = carry;  
  if(c[len_max]==1) cout << 1;  
  for(int i=len_max-1; i>=0; i--) cout << c[i];  
  return 0;  
}  
 
第三种方法:进位操作分离:
 
[cpp]  
#include <iostream>  
#include <cstring>  
using namespace std;  
  
int main()  
{  
  char x[555],y[555];  
  int a[555]={0},b[555]={0},c[555]={0};  
  cin >> x >> y;  
  int len_x = strlen(x);  
  int len_y = strlen(y);  
  for(int k=0; k<len_x; k++)  
  {  
    a[k]=x[len_x-1-k]-'0';  
  }  
  for(int k=0; k<len_y; k++)  
  {  
    b[k]=y[len_y-1-k]-'0';  
  }  
  int len_max = len_x>len_y?len_x:len_y;  
    
  for(int i=0; i<len_max; i++)  
  {  
    c[i]=a[i]+b[i];  
  }  
  for(int i=0; i<len_max; i++)  
  {  
    if(c[i]>=10)  
    {  
      c[i+1]++;  
      c[i] -= 10;  
    }  
  }  
    
  if(c[len_max]==1) cout << 1;  
  for(int i=len_max-1; i>=0; i--) cout << c[i];  
  return 0;  
}  
 
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,