A+B(浙江大学2010上机)

Problem Description
给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号","隔开。
现在请计算A+B的结果,并以正常形式输出。
 
Input
输入包含多组数据数据,每组数据占一行,由两个整数A和B组成(-10^9 < A,B < 10^9)(没有超出整型的表示范围)
 
Output
请计算A+B的结果,并以正常形式输出,每组数据占一行。
 
Sample Input
-234,567,890 123,456,789 1,234 2,345,678
 
Sample Output
-111111101 2346912
 
瞧瞧我臃肿复杂的代码,竟然也过了,可是足足花了我一个小时啊,这要是在战场还不彻底完蛋?
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>

typedef struct big
{
int num[10];
int len;
int sign;
}bigNum;

using namespace std;

void rev(int a[], int &len)
{
for (int i = 0, j = len-1; i < j; i++, j--)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}

void getData(string &s, bigNum &a)
{
int i,j;
if (s[0] == '-')
{
a.sign = -1;
i = 1;
}
else if (s[0] == '+')
{
a.sign = 1;
i = 1;
}
else
{
a.sign = 1;
i = 0;
}

for (j =0; i < s.size(); i++)
{
if (s[i] == ',')
continue;
a.num[j++] = s[i]-'0';
}
rev(a.num,j);
a.len = j;
}

void add(bigNum &a, bigNum &b, bigNum &ans)
{
int i;
for (i = 0; i <a.len && i <b.len; i++)
{
ans.num[i] += a.num[i]+b.num[i];
if (ans.num[i] >= 10)
{
ans.num[i+1] += ans.num[i] / 10;
ans.num[i] %= 10;
}
}
if (a.len != b.len)
{
for (;i < a.len; i++)
{
ans.num[i] += a.num[i];
if (ans.num[i] >= 10)
{
ans.num[i+1] += ans.num[i] / 10;
ans.num[i] %= 10;
}
}
for (;i < b.len; i++)
{
ans.num[i] += b.num[i];
if (ans.num[i] >= 10)
{
ans.num[i+1] += ans.num[i] / 10;
ans.num[i] %= 10;
}
}
}
if (ans.num[i] != 0)
ans.len = i+1;
else
ans.len = i;
}

void sub(bigNum &a, bigNum &b, bigNum &ans)
{
int i;
for (i = 0; i <a.len && i <b.len; i++)
{
ans.num[i] += a.num[i]-b.num[i];
if (ans.num[i] < 0)
{
ans.num[i+1]--;
ans.num[i] += 10;
}
}
if (a.len != b.len)
{
for (;i < a.len; i++)
{
ans.num[i] += a.num[i];
if (ans.num[i] < 0)
{
ans.num[i+1]--;
ans.num[i] += 10;
}
}
for (;i < b.len; i++)
{
ans.num[i] += b.num[i];
if (ans.num[i] < 0)
{
ans.num[i+1]--;
ans.num[i] += 10;
}
}

}
int j;
for (j=0, ans.len=0; j < i; j++)
{
if (ans.num[j] != 0)
ans.len = j+1;
}
}

int cmp(bigNum &a, bigNum &b)
{
if (a.len > b.len)
return 1;
else if (a.len < b.len)
return -1;
else
{
for (int i = a.len-1; i >= 0; i--)
{
if (a.num[i] > b.num[i])
return 1;
else if (a.num[i] < b.num[i])
return -1;
}
return 0;
}
}
void caculate(bigNum &a, bigNum &b, bigNum &ans)
{
if (a.sign != b.sign)
{
int eq = cmp(a,b);
if (eq == 0)
{
ans.len = 1;
ans.num[0] = 0;
ans.sign = 1;
return ;
}
if (eq > 0)
{
sub(a,b,ans);
if (a.sign>b.sign)
ans.sign = 1;
else
ans.sign = -1;
}
else
{
sub(b,a,ans);
if (a.sign>b.sign)
ans.sign = -1;
else
ans.sign = 1;
}
}
else
{
add(a,b,ans);
ans.sign = a.sign;
}
}

int main(void)
{
bigNum a,b,ans;
string s1,s2;
fstream cin("hello.txt");

while(cin >> s1 >> s2)
{
getData(s1,a);
getData(s2,b);
memset(&ans, 0, sizeof(ans));
caculate(a,b,ans);
if (ans.sign == -1)
cout << '-';
for (int i = ans.len-1; i >= 0; i--)
cout << ans.num[i];
cout << endl;
}
return 0;
}
再看个简单高效版的,怎么就那么笨呢?
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;
int main(int argc, char* argv[])
{
freopen("in.txt", "r", stdin);
char inputA[50]={0};
char inputB[50]={0};
while(cin>>inputA>>inputB)
{
string strA(inputA);
string strB(inputB);
         // remove并没有删除',',只是将其移到最后,下面的语句即完成删除','操作
strA.erase(remove(strA.begin(), strA.end(), ','), strA.end());
strB.erase(remove(strB.begin(), strB.end(), ','), strB.end());
int nA=atoi(strA.c_str());
int nB=atoi(strB.c_str());
cout<<nA+nB<<"\n";

memset(inputA, 0, sizeof(char)*50);
memset(inputB, 0, sizeof(char)*50);
}
return 0;
}
向大牛致敬,学海无涯,菜鸟许多努力啊。
posted @ 2012-02-24 23:42  吞枣  Views(483)  Comments(1)    收藏  举报