1308:【例1.5】高精除
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 9971 通过数: 4757
【题目描述】
高精除以高精,求它们的商和余数。
【输入】
输入两个低于300位的正整数。
【输出】
输出商和余数。
【输入样例】
1231312318457577687897987642324567864324567876543245671425346756786867867867
1231312318767141738178325678412414124141425346756786867867867
【输出样例】
999999999748590
179780909068307566598992807564736854549985603543237528310337
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int a[101], b[101], c[101], d;
void init(int a[]) {
string s;
cin >> s; // 读入字符串s
a[0] = s.length(); // 用a[0]计算字符串s的位数
for (int i=1; i<=a[0]; i++) {
a[i] = s[a[0]-i] - 48; // 将数串s转换为数组a,并倒序存储
}
}
void print(int a[]) { // 打印输出
if (a[0] == 0) {
cout << 0 << endl;
return;
}
for (int i=a[0]; i>=1; i--) {
cout << a[i];
}
cout << endl;
return;
}
int compare(int a[], int b[]) { // 比较a和b的大小关系,若a>b则为1,a<b则为-1,a=b则为0
if (a[0] > b[0]) {
return 1;
}
if (a[0] < b[0]) {
return -1;
}
for (int i=a[0]; i>=1; i--) { // 从高位到低位比较
if (a[i] > b[i]) {
return 1;
}
if (a[i] < b[i]) {
return -1;
}
}
return 0; // 各位都相等则两数相等
}
void numcpy(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;
}
void jian(int a[], int b[]) { // 计算 a=a-b
int flag = compare(a, b); // 调用比较函数判断大小
if (flag == 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 chugao(int a[], int b[], int c[]) {
int tmp[101];
c[0] = a[0] - b[0] + 1;
for (int i=c[0]; i>0; i--) {
memset(tmp, 0, sizeof(tmp)); // 数组清零
numcpy(b, tmp, i);
while (compare(a, tmp) >= 0) {
c[i]++;
jian(a, tmp); // 用减法来模拟
}
}
while (c[0]>0 && c[c[0]]==0) {
c[0]--;
}
return;
}
int main() {
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
init(a);
init(b);
chugao(a,b,c);
print(c);
print(a);
return 0;
}