您的位置:首页 > 其它

高精度减&&除法

2015-07-26 16:02 351 查看
高精度减法

/*与加法差不多,逆序相减,但要把高位的零去掉*/

代码如下:

#include<iostream>
#include<cstring>
#define maxn 1000000+10
using namespace std;
int na[maxn],nb[maxn],nc[maxn];
char a[maxn],b[maxn];
void sub()
{
int lena,lenb;
memset(na,0,sizeof(na));
memset(nb,0,sizeof(nb));
lena=strlen(a),lenb=strlen(b);
for(int i=0;i<lena;i++) na[i]=a[lena-i-1]-'0';
for(int i=0;i<lenb;i++) nb[i]=b[lenb-i-1]-'0';
int max=lena>=lenb?lena:lenb;
//if(max==lenb) return;
for(int i=0;i<max;i++)
{
na[i]-=nb[i];
if(na[i]<0) na[i]+=10,na[i+1]--;
}
while(!na[max-1]&&max>0) max--;
if(!max) max++;
for(int i=0;i<max;i++) a[i]=na[max-i-1]+'0';
a[max]='\0';
}
int main()
{
while(cin>>a>>b)
{
sub();
cout<<a<<endl;
}
}


高精度除法

/*虽然实质就是减法,但注意点较多,具体看注释*/

#include<iostream>
#include<cstring>
#define maxn 200+10
using namespace std;
int na[maxn],nb[maxn],nc[maxn];
char a[maxn],b[maxn];
int sub(int *pna,int *pnb,int lena,int lenb)
{
if(lena<lenb) return -1;
if(lena==lenb)
{
bool flag=false;//判断位数一样时两数大小
for(int i=lena-1;i>=0;i--)
{
if(pna[i]>pnb[i]) flag=true;
else if(pna[i]<pnb[i]) if(!flag) return -1;
}
}
for(int i=0;i<lena;i++)
{
pna[i]-=pnb[i];
if(pna[i]<0) pna[i]+=10,pna[i+1]--;
}
for(int i=lena-1;i>=0;i--) if(pna[i]) return i+1;
return 0; //lena=1且pna[0]=0,也就是被除数与除数相等,返回0
}
void div()
{
int lena=strlen(a),lenb=strlen(b);
memset(na,0,sizeof(na));
memset(nb,0,sizeof(nb));
memset(nc,0,sizeof(nc));
if(lena<lenb)
{
cout<<'0'<<endl;
return;
}
for(int i=0;i<lena;i++) na[i]=a[lena-i-1]-'0';
for(int i=0;i<lenb;i++) nb[i]=b[lenb-i-1]-'0';
lena=sub(na,nb,lena,lenb);
if(lena<0)
{
cout<<'0'<<endl;
return ;
}else if(lena==0)
{
cout<<'1'<<endl;
return ;
}
nc[0]++;				//被除数减去一次除数,商加一
int len=lena-lenb;      //被除数和除数相差位数
if(len<0) goto output;
else if(len>0){
for(int i=lena-1;i>=0;i--)    //位数不同时,乘上10的倍数使位数相同
{
if(i>=len) nb[i]=nb[i-len];
else nb[i]=0;
}
}
lenb=lena;                   //注意别忘记此时两者位数要相同
for(int i=0;i<=len;i++)
{
int cnt;
while((cnt=sub(na,nb+i,lena,lenb-i))>=0) //被除数减去与自己位数相同直到除数位数与原来相同
{
lena=cnt;
nc[len-i]++;     //商最多的位数为被除数的位数减去除数的位数加一
}
}
output:
for(int i=0;i<len;i++) nc[i+1]+=nc[i]/10,nc[i]%=10;  //处理进位
int max=maxn-1;       //注意数组最大下标为maxn-1
while(!nc[max]&&max>0) max--;
for(int i=max;i>=0;i--) cout<<nc[i];
cout<<endl;
}
int main()
{
while(cin>>a>>b)
{
div();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: