求救,这个高精度整数算法为什么最后结果不对啊

温JZ 2020-05-10 09:41:13
#include<iostream>
#include<stdlib.h>
#include<cstring>
using namespace std;
int n,m;
char numberN[1500],numberM[1500];
int *a,*b,*r;
void input_integer()
{
cin>>numberN;
cin>>numberM;
n=strlen(numberN);
m=strlen(numberM);
a=new int[n];
b=new int[m];
for(int i=0,j=n-1;i<n;i++,j--)
{
a[i]=numberN[j]-'0';
}
for(int i=0,j=m-1;i<m;i++,j--)
{
b[i]=numberM[j]-'0';
}
}
void integer_add(int a[],int b[],int n,int m)
{
r=new int[3000];
for(int i=0;i<3000;i++)r[i]=0;
if(n>=m)
{
for(int i=0;i<m;i++)
r[i]=a[i]+b[i];
for(int i=m;i<n;i++)
{
r[i]+=a[i];
}
}
else
{
for(int i=0;i<n;i++)
r[i]=a[i]+b[i];
for(int i=n;i<m;i++)
r[i]+=b[i];
}
for(int i=0;i<n;i++)
{
if(r[i]>10)
{
r[i+1]+=r[i]/10;
r[i]%=10;
}
}
int j;
for(j=2999;j>0;j--)
{
if(r[j]!=0)
break;
}
for(int i=j;i>=0;i--)
{
cout<<r[i];
}
cout<<endl;
}
void integer_sub(int a[],int b[],int n,int m)
{
int j;
for(int i=0;i<3000;i++)r[i]=0;
if(n>=m)
{
for(int i=0;i<m;i++)
r[i]=a[i]-b[i];
for(int i=m;i<n;i++)
r[i]+=a[i];
}
else if(n<m)
{
for(int i=0;i<n;i++)
r[i]=a[i]-b[i];
for(int i=n;i<m;i++)
r[i]-=b[i];
}
for(j=2999;j>0;j--)
{
if(r[j]!=0)
break;
}
for(int i=0;i<j;i++)
{
if(r[i]<0)
{
r[i+1]--;
r[i]+=10;
}
}
for(j=2999;j>0;j--)
{
if(r[j]!=0)
break;
}
for(int i=j;i>=0;i--)
cout<<r[i];
cout<<endl;
}
void integer_multi(int a[],int b[],int n,int m)
{
int j;
for(int i=0;i<3000;i++)r[i]=0;
for(int i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
r[i+j]+=a[i]*b[j];
}
}
for(int i=0;i<n+m;i++)
{
if(r[i]>=10)
{
r[i+1]+=r[i]/10;
r[i]%=10;
}
}
for(j=2999;j>0;j--)
{
if(r[j]!=0)
break;
}
for(int i=j;i>=0;i--)
{
cout<<r[i];
}
cout<<endl;
}
int integer_Substract(int a[],int b[],int n,int m)
{
int i;
if(n<m)
return -1;
if(n==m)
{
for(i=n-1;i>=0;i--)
{
if(a[i]>b[i])
break;
else if(a[i]<b[i])
return -1;
}
}
for(i=0;i<n-1;i++)
{
a[i]-=b[i];
if(a[i]<0)
{
a[i]+=10;
a[i+1]--;
}
}
for(i=n-1;i>=0;i--)
if(a[i])
return i+1;
return 0;

}
void integer_divide(int a[],int b[],int n,int m)
{
int i,j;
int nTimes;
int nTemp;
for(i=0;i<3000;i++)
r[i]=0;
if(n<m)
{
cout<<"0"<<endl;
}
nTimes=n-m;
for(i=n-1;i>=0;i--)
{
if(i>=nTimes)
b[i]=b[i-nTimes];
else
b[i]=0;
}
m=n;
for(j=0;j<=nTimes;j++)
{
while(nTemp=integer_Substract(a,b+j,n,m-j)>=0)
{
n=nTemp;
r[nTimes-j]++;
}
}
for(j=2999;r[i]==0&&i>=0;i--);
if(i>=0)
{
for(;i>=0;i--)
cout<<r[i];
}
else
cout<<"0";
cout<<endl;
cout<<"余数为:";
for(i=n-1;i>=0;i--)cout<<a[i];
cout<<endl;
}
int main()
{
cout<<"请输入两个整数:"<<endl;
input_integer();
cout<<"两数和为:"<<endl;
integer_add(a,b,m,n);
cout<<"两数差为:"<<endl;
integer_sub(a,b,m,n);
cout<<"两数积为:"<<endl;
integer_multi(a,b,m,n);
cout<<"两数商为:"<<endl;
integer_divide(a,b,m,n);
system("pause");
return 0;
}

...全文
91 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
跟踪调试是基本技能,学会了跟踪执行,找出问题就很容易了。

65,179

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧