运算思路如下思路:
以1234 / 7为例:
- 1与7比较, 不够除, 因此该位商为 0, 余数为1。
- 余数1与新位 2组合成12, 12与7比较, 够除, 商为1, 余数为5。
- 余数 5与新位 3组合成 53, 53与 7 比较, 够除, 商为 7, 余数为 4。
- 余数 4与新位 4组合成 44, 44与 7 比较, 够除, 商为 6, 余数为 2。
- 上一步的余数乘以10加上该步的位, 得到该步临时的被除数,
将其与除数比较: 如果不够除, 则该位的商为 0: 如果够除, 则商即为对应的商, 余数即为对应的余数。 最后一步要注意减法后高位可能有多余的O, 要忽视它们, 但也要保证结果至少有一位数。
代码思路如下:
#include<bits/stdc++.h>
using namespace std;
struct bign {
int d[1000];
int len;
bign() {//初始化
memset(d,0,sizeof(d));
len=0;
}
};
bign change(char str[]) {//将整数转换为bign
bign a;
a.len=strlen(str);
for(int i=0; i<a.len; i++) a.d[i]=str[a.len-i-1]-'0';
return a;
}
int compare(bign a,bign b) {//比较一下a和b的大小
if(a.len>b.len) return 1;
else if(a.len<b.len) return -1;
else {
for(int i=0; i<a.len; i++) {
if(a.d[i]>a.d[i]) return 1;
else if(a.d[i]<a.d[i]) return -1;
}
return 0;
}
}
bign divide(bign a,int b,int& r) { //高精度除法,r为余数
bign c;
c.len=a.len;//被除数的第一位和商的第一位是一一对应的,因此先令长度相等
for(int i=a.len-1; i>=0; i--) { //从高位开始
r=r*10+a.d[i];//和上一位遗留的余数组合
if(r<b) c.d[i]=0;//不够除,该位为零
else {//够除
c.d[i]=r/b;//商
r=r%b;//获得新的余数
}
}
while(c.len>=1&&c.d[c.len-1]==0) {
c.len--;//去除高位的0,同时至少保留一位最低位
}
return c;
}
void print(bign a) {
for(int i=a.len-1; i>=0; i--) printf("%d",a.d[i]);
}
int main() {
char str[1000];
int x,y=0;
scanf("%s%d",str,&x);
bign a=change(str);
print(divide(a,x,y));
return 0;
}
特别提醒:
函数每次只能返回一个数据,而很多题目里面会经常要求得到余数,因此把余数写成 “引用” 的形式直接作为参数传入,或是把r设成全局变量。其作用是在函数中可以视作直接对原变量进行修改,而不像普通函数参数那样,在函数中的修改不影响原变量的值。 这样当函数结束时,r的值就是最终的余数。
以上的bign的储存形式详解可连接:大整数加法和储存