#define MAXSIZE 100
////高精度算法
struct Data
{
int len; //数据长度
int s[MAXSIZE]; // 保存数据数组
};
void StringToData(const string& s, Data& d) //将string 转换为Data
{
if (s.size() == 0)
{
return;
}
ZeroMemory(&d, sizeof(d));
d.len = s.length();
for (int i = 0; i < d.len; ++i)
{
d.s[i] = s[d.len - i - 1] - '0'; //比如说s ="123",那么s依次为3、2、1
}
}
void Display(const Data& d)
{
for (int i = d.len - 1; i >= 0; --i)
{
cout<<d.s[i];
}
}
void Add(const Data& d1, const Data& d2, Data& ret) //高精度加法
{
int len;
int distance_len = 0; //长度差
bool flag = 0; //默认的是d1长
if (d1.len > d2.len )
{
len = d2.len;
distance_len = d1.len - d2.len;
}
else
{
len = d1.len;
distance_len = d2.len - d1.len;
flag = 1;
}
ZeroMemory(&ret, sizeof(ret));
int temp = len;
//先把多余的数据保存在ret
for (int i = 1; i <= distance_len; ++i)
{
if (flag)
{
ret.s[temp] = d2.s[len + i - 1];
}
else
{
ret.s[temp] = d1.s[len + i - 1];
}
++temp;
}
for (int i = 0; i < len; ++i)
{
ret.s[i] = d1.s[i] + d2.s[i];
}
////////进位处理,如果大于10的话进1
for (int i = 0 ; i < len + distance_len; ++i)
{
if (ret.s[i] >= 10)
{
ret.s[i] -= 10;
ret.s[i + 1] ++;
}
}
ret.len = distance_len + len;
if (ret.s[len + distance_len] > 0)
{
++ret.len;
}
}
void Subtract( Data& d1, Data& d2, Data& ret) //假定d1>=d2
{
ZeroMemory(&ret, sizeof(ret));
ret.len = d1.len;
for (int i = 0; i < d1.len; ++i)
{
ret.s[i] = d1.s[i] - d2.s[i] + 10;
d1.s[i + 1] = d1.s[i + 1] - 1 +ret.s[i]/10;
ret.s[i] %= 10;
}
int j = 0;
while (ret.s[j]==0 && j < ret.len) j++;
if (j == ret.len) //如果结果全部为0
{
ret.len = 1; //长度为1
return;
}
while (ret.s[ret.len - 1] == 0) //把后面的0滤掉
{
ret.len--;
}
}
int main()
{
string s1 = "130000000000000000000000";
Data a;
StringToData(s1, a);
string s2 = "455555500000";
Data b;
StringToData(s2, b);
Data c;
Subtract(a, b, c);
Display(c);
cout<<endl;
string s3= "130000000000000000000000";
Data e;
StringToData(s3, e);
string s4 = "455555500000";
Data f;
StringToData(s4, f);
Data g;
Add(e, f, g);
Display(g);
return 0;
}