急!50分求一段C++程序!在线等!输入两个大的整数(40位以内),求它们的差并输出

输入两个大的整数(40位以内),求它们的差并输出:

例如输入:

200000000000000000000000000000000

100000000000000000000000000000000

输出

100000000000000000000000000000000
要求贴代码 ;能不能代码再简单点

//高精度减法,应该还可以优化
//正数减正数、正数减负数、负数减正数、负数减负数、大数减小数、小数减大数都考虑到了
//请保证输入的数的合法性

#include<iostream>
using namespace std;

#define MAXSIZE 50

void minus(char *x1, char *x2)
{
int a[MAXSIZE], b[MAXSIZE], tmp[MAXSIZE], ans[MAXSIZE];
int l1, l2, i, st, p1=0, p2=0, pt, pm, pos;
bool m1, m2, chg;

for(i=0; i<MAXSIZE; i++)
a[i]=b[i]=tmp[i]=ans[i]=0;
m1=(x1[0]=='-');
m2=(x2[0]=='-');
if(!m1 && !m2) st=1;
else if(m1 && !m2) st=2;
else if(!m1 && m2) st=3;
else if(m1 && m2) st=4;

l1=strlen(x1);
if(m1) for(i=l1-1; i>=1; i--)
{
a[p1]=x1[i]-'0';
p1++;
}
else for(i=l1-1; i>=0; i--)
{
a[p1]=x1[i]-'0';
p1++;
}

l2=strlen(x2);
if(m2) for(i=l2-1; i>=1; i--)
{
b[p2]=x2[i]-'0';
p2++;
}
else for(i=l2-1; i>=0; i--)
{
b[p2]=x2[i]-'0';
p2++;
}
pm=p1>p2?p1:p2;

if(st==1 || st==4)
{
chg=(p1<p2);
if(p1==p2) for(i=p1-1; i>=0; i--)
if(a[i]<b[i])
{
chg=true;
break;
}
else if(a[i]>b[i]) break;
if(chg)
{
for(i=0; i<p1; i++) tmp[i]=a[i];
for(i=0; i<p2; i++) a[i]=b[i];
for(i=0; i<p1; i++) b[i]=tmp[i];
for(i=p1; i<p2; i++) b[i]=0;
pt=p1; p1=p2; p2=pt;
}

for(i=0; i<pm; i++)
ans[i]=a[i]-b[i];
for(i=0; i<MAXSIZE-1; i++)
while(ans[i]<0)
{
ans[i]+=10;
ans[i+1]--;
}
if((st==1 && chg) || (st==4 && !chg)) cout<<"-";
}
else
{
for(i=0; i<pm; i++)
ans[i]=a[i]+b[i];
for(i=0; i<MAXSIZE-1; i++)
while(ans[i]>9)
{
ans[i]-=10;
ans[i+1]++;
}
if(st==2) cout<<"-";
}

pos=MAXSIZE-1;
while(pos>-1 && !ans[pos]) pos--;
if(pos==-1) cout<<"\b0";
for(i=pos; i>=0; i--) cout<<ans[i];
cout<<endl;
}

int main()
{
char x1[MAXSIZE], x2[MAXSIZE];
cin>>x1>>x2;
minus(x1,x2);
return(0);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-05-04
#include <iostream>
#include <string>

using namespace std;
string calc(const string &n1, const string &n2);

int main()
{
string num1, num2;

do
{
cout << "请输入两个数字(!退出程序):" << endl;
cin >> num1;

if (num1[0] < '0' || num1[0] > '9')
break;

cin >> num2;
cout << calc(num1, num2) << endl;
} while (1);

return 0;
}

string calc(const string &n1, const string &n2)
{
string ret = "", num1 = n1, num2 = n2;
int len1, len2, i, j;
len1 = num1.length(), len2 = num2.length();
i = len1 - 1, j = len2 - 1;

if (len1 > len2)
{
L1:
for (; j >= 0; --i, --j)
{
int temp = num1[i] - num2[j];

if (temp < 0)
{
num1[i] += (10 - (num2[j] - '0'));
num1[i - 1] -= 1;

for (int k = i - 1; k >= 0; --k)
{
if (num1[k] < '0')
{
num1[k] += 10;

if (k - 1 >= 0)
num1[k - 1] -= 1;
}
else
break;
}
}
else
num1[i] = ('0' + temp);
}

i = 0;
while (num1[i] <= '0' || num1[i] > '9') ++i;

ret = num1.substr(i);
}
else if (len1 < len2)
{
L2:
for (; i >= 0; --i, --j)
{
int temp = num2[j] - num1[i];

if (temp < 0)
{

num2[j] += (10 - (num1[i] - '0'));
num2[j - 1] -= 1;

for (int k = j - 1; k >= 0; --k)
{
if (num2[k] < '0')
{
num2[k] += 10;

if (k - 1 >= 0)
num2[k - 1] -= 1;
}
else
break;
}
}
else
num2[j] = ('0' + temp);
}

ret = '-';
i = 0;

while (num2[i] <= '0' || num2[i] > '9') ++i;

ret += num2.substr(i);
}
else
{
int less = 0;

for (int k = len1 - 1; k >= 0; --k)
{
if (num1[k] < num2[k])
less = 1;
else if (num1[k] > num2[k])
less = 0;
}

if (!less)
{
goto L1;
}
else
{
goto L2;
}
}

return ret;
}
第2个回答  2009-05-04
代码我就不贴了,你直接去下面的地址看吧。不知道楼主为什么不喜欢在网上搜索,而去浪费积分。
http://wenda.tianya.cn/wenda/thread?tid=3ba2facad9c778cc
第3个回答  2009-05-04
哈…想到了…用字符数组做…char 的48对应0,57对应9,9-0=57-48=9,还行!如char a[40],b[40];
第4个回答  2009-05-04
我前面一段时间做过一个大数计算器.位数好像是达到100位.能进行加减乘除运算.但是我记得我做得不太完善.好像有几个BUG.如果你需要的话可以再留言.我先检查检查看看没有多大的问题能修改的修改好然后我就发给你.OK?
第5个回答  2009-05-04
字符串处理吧
相似回答