【题目描述】
高精除以高精,求它们的商和余数。
【输入】
输入两个低于300位的正整数。
【输出】
输出商和余数。
【输入样例】
12313123184575776878979876423245678643245678765432456714253467567868678678671231312318767141738178325678412414124141425346756786867867867
【输出样例】
999999999748590 179780909068307566598992807564736854549985603543237528310337
【解题思路】
由于被除数和除数均为大整数,所以无法直接用除法来得出答案,因此解题的思路是用减法来模拟除法。
【题解代码】
#include <bits/stdc++.h>
using namespace std;
int a[305],b[305],c[305];
void init(int a[]){ //输入函数
string s;
cin >> s;
a[0] = s.length(); //数组的第0位用于储存输入数的位数
for (int i=1;i<=a[0];i++) a[i] = s[a[0]-i]-'0'; //逆序储存,便于减法运算
return;
}
void print(int a[]){ //输出函数
if (a[0] == 0){ //若商或余数的位数为0,则输出0
cout << 0 << endl;
return;
}
for (int i=a[0];i>0;i--) cout << a[i]; //若商或余数的位数不为0,则输出
cout << endl;
return;
}
int compare(int a[],int b[]){ //比较函数,用于减法运算
if (a[0] > b[0]) return 1; //a的位数比b的位数大,则a大于b,返回1
if (a[0] < b[0]) return -1; //a的位数比b的位数小,则a小于b,返回-1
for (int i=a[0];i>0;i--){ //逐位比较
if (a[i] > b[i]) return 1;
if (a[i] < b[i]) return -1;
}
return 0; //若a与b相等,则返回0
}
void subtract(int a[],int b[]){ //减法函数
int flag;
flag = compare(a,b);
if (flag == 0){ //若a与b相等,则a位数为0,即被减数为0
a[0] = 0;
return;
}
if (flag == 1){ //
for (int i=1;i<=a[0];i++){
if (a[i] < b[i]) a[i+1]--,a[i] += 10; //不够减要借位
a[i] -= b[i];
}
while (a[0]>0 && a[a[0]]==0) a[0]--; //修正a的位数
return;
}
}
void num_cpy(int p[],int q[],int det){ //复制p数组到q数组从det开始的地方,方便减法运算
for (int i=1;i<=p[0];i++) q[i+det-1] = p[i];
q[0] = p[0]+det-1; //q[0]表示q数组的位数
return;
}
void div_mtd(int a[],int b[],int c[]){ //除法函数,c数组表示商
int tmp[305]; //tmp是一个暂时储存除数的容器,用于subtract()运算
c[0] = a[0]-b[0]+1; //商的位数
for (int i=c[0];i>0;i--){
memset(tmp,0,sizeof(tmp)); //数组清零
num_cpy(b,tmp,i);
while (compare(a,tmp) >= 0) c[i]++,subtract(a,tmp);
}
while (c[0]>0 && c[c[0]]==0) c[0]--; //删除前导0
return;
}
int main(){
init(a);init(b);
div_mtd(a,b,c);
print(c);
print(a);
return 0;
}