题目描述:
输入两个正整数,求它们的商(做整除)。
分析:
做除法时,每一次的商的值都在0~9之间,每次求得的余数连接以后的若干位得到新的被除数,继续做除法。因此,在做高精度除法时,要涉及到乘法运算和减法运算,还有移位处理。当然,为了程序简洁,可以避免高精度乘法,用0~9次循环减法取代得到商的值。这里,我们讨论一下高精度数除以单精度数的结果,采取的方法是按位相除法。
话不多说,上代码:
#include<bits/stdc++.h>
using namespace std;
#define MAX 105
char a1[MAX],c1[MAX];
int a[MAX],c[MAX],lena,lenc,x=0,b;
int main(){
memset(a,0,sizeof a);
memset(c,0,sizeof c);
gets(a1);
cin>>b;
lena=strlen(a1);
for(int i=0;i<lena;i++) a[i+1]=a1[i]-48;
for(int i=1;i<=lena;i++){//按位相除
c[i]=(x*10+a[i])/b;
x=(x*10+a[i])%b;
}
lenc=1;
while(c[lenc]==0&&lenc<lena) lenc++;//删除前导0
for(int i=lenc;i<=lena;i++) cout<<c[i];
cout<<endl;
return 0;
}
刚刚那个代码在某些OJ过不了,所以接下来还有一篇代码。
#include<bits/stdc++.h>
using namespace std;
#define MAX 5005
int b,c,s,len,i,j;
char a[MAX],p[MAX];
int main(){
cin>>a>>b;
len=strlen(a);
for(i=0;i<len;i++){
s=s*10+a[i]-'0';
p[i]=s/b;
s%=b;
}
while(!p[j]&&j<len) j++;
if(j==len) puts("0");
else{
for(i=j;i<len;i++){
p[i]=p[i]+48;
printf("%c",p[i]);
}
}
return 0;
}