读书人

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

发布时间: 2012-09-23 10:28:11 作者: rapoo

两个大数相加问题,有一点点问题!
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()));  } 

读书人网 >C++

热点推荐