首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

两个大数相加有关问题,有一点点有关问题

2012-09-23 
两个大数相加问题,有一点点问题!vector的rend()成员函数返回的迭代器是指向第一个值的前一个位置吧?看程序

两个大数相加问题,有一点点问题!
vector的rend()成员函数返回的迭代器是指向第一个值的前一个位置吧?看程序中最后输出结果的时候,
为什么要-1才能正确?请帮忙看看

#include <iostream>
#include <string>
#include <vector>
#include <cstdlib> //atoi
using namespace std;

int main()
{
  string szFirst;
  string szSecond;
string szNull;
vector<int> vec;
  int nCarrybit = 0; //进位

  while (cin >> szFirst >> szSecond)
  {
  int nLenOfFirst = szFirst.size();
  int nLenOfSecond = szSecond.size();

  int i = nLenOfFirst ;
  int j = nLenOfSecond;
  int k = 0;
  while (i >= 0 && j >= 0)
  {
string tmp1 = szNull + szFirst[i--];
string tmp2 = szNull + szSecond[j--];
  int tmp = atoi(tmp1.c_str()) + atoi(tmp2.c_str());  
   
vec.push_back(tmp % 10 + nCarrybit);
nCarrybit = tmp / 10;
  }

if (nCarrybit != 0)
{
string tmp1 = szNull + szFirst[i--];
string tmp2 = szNull + szSecond[j--];
if (i >= 0)
vec.push_back(nCarrybit + atoi(tmp1.c_str()));
if (j >= 0)
  vec.push_back(nCarrybit + atoi(tmp2.c_str()));
}

  while (i >= 0)
  {
string tmp1 = szNull + szFirst[i--];
  vec.push_back(atoi(tmp1.c_str()));
  }
  while (j >= 0)
  {
string tmp2 = szNull + szSecond[j--];
  vec.push_back(atoi(tmp2.c_str()));
  }

  for (vector<int>::reverse_iterator iter = vec.rbegin(); iter < vec.rend()-1; ++iter)
  {
cout << *iter;
  }
cout << endl;
vec.clear(); //清空容器
  }
return 0;
}


[解决办法]
以前写过一个:
http://blog.csdn.net/agoago_2009/article/details/6862290
[解决办法]
我也写过大数的加减乘除
[解决办法]

C/C++ code
int nLenOfFirst = szFirst.size();  int nLenOfSecond = szSecond.size();  int i = nLenOfFirst ;  int j = nLenOfSecond;
[解决办法]
C/C++ code
#include <stdio.h>#include <string.h>#define MAXLEN 1000char a1[MAXLEN];char a2[MAXLEN];static int v1[MAXLEN];static int v2[MAXLEN];static int v3[MAXLEN];int i,j,n,L,z;void main(void) {    scanf("%d",&n);    for (j=0;j<n;j++) {        scanf("%s%s",a1,a2);        L=strlen(a1);        for (i=0;i<L;i++) v1[i]=a1[L-1-i]-'0';        L=strlen(a2);        for (i=0;i<L;i++) v2[i]=a2[L-1-i]-'0';        for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i];        for (i=0;i<MAXLEN;i++) {            if (v3[i]>=10) {                v3[i+1]+=v3[i]/10;                v3[i]=v3[i]%10;            }        }        printf("Case %d:\n", j+1);        printf("%s + %s = ", a1, a2);        z=0;        for (i=MAXLEN-1;i>=0;i--) {            if (z==0) {                if (v3[i]!=0) {                    printf("%d",v3[i]);                    z=1;                }            } else {                printf("%d",v3[i]);            }        }        if (z==0) printf("0");        printf("\n");    }}//Sample Input//3//0 0//1 2//112233445566778899 998877665544332211////Sample Output//Case 1://0 + 0 = 0//Case 2://1 + 2 = 3//Case 3://112233445566778899 + 998877665544332211 = 1111111111111111110 


[解决办法]

C/C++ code
if (nCarrybit != 0){string tmp1 = szNull + szFirst[i--];string tmp2 = szNull + szSecond[j--];if (i >= 0)vec.push_back(nCarrybit + atoi(tmp1.c_str()));if (j >= 0)  vec.push_back(nCarrybit + atoi(tmp2.c_str()));}  while (i >= 0)  {string tmp1 = szNull + szFirst[i--];  vec.push_back(atoi(tmp1.c_str()));  }  while (j >= 0)  {string tmp2 = szNull + szSecond[j--];  vec.push_back(atoi(tmp2.c_str()));  } 

热点排行