时间限制: 1000 ms 内存 u限制: 65536 KB
提交数: 14176 通过数: 6917
【题目描述】
高精除以高精,求它们的商和余数。
【输入】
输入两个低于300位的正整数。
【输出】
输出商和余数。
【输入样例】
1231312318457577687897987642324567864324567876543245671425346756786867867867
1231312318767141738178325678412414124141425346756786867867867
【输出样例】
999999999748590
179780909068307566598992807564736854549985603543237528310337
#include<iostream>
using namespace std;
string s1, s2;
int a[301], b[301], c[301], tmp[301];
int la, lb, lc, lt;//定义长度在外面
void reverseStrtoInt(string src, int* des) {
for (int i = 0; i < src.size(); i++) {
des[src.size() - i] = src[i] - '0';
}
}
int move(int B[], int TMP[], int LB, int I) {
for (int i = 1; i <= LB; i++) {
TMP[i + I] = B[i];
}
return LB + I;
}
int mycmp(int A[], int TMP[], int LA, int LT) {
if (LA > LT) {
return 1;
}
else if (LA < LT) {//if
return -1;
}
else {//无else
for (int i = LA; i >= 1; i--) {
if (A[i] > TMP[i]) {
return 1;
}
if (A[i] < TMP[i]) {
return -1;
}
}
}
return 0;
}
void sub(int A[], int TMP[], int& LA,int LT) {//记得传引用
for (int i = 1; i <= LT; i++) {
if (A[i] < TMP[i]) {
A[i + 1]--;
A[i] += 10;
}
A[i] = A[i] - TMP[i];
}
while (A[LA] == 0 && LA > 1) LA--;
}
int main() {
cin >> s1 >> s2;
if (s2[0] == '0') {
return 0;
}
la = s1.size(),lb=s2.size();
lc = la - lb + 1;
reverseStrtoInt(s1, a);
reverseStrtoInt(s2, b);
for (int i = lc; i >= 1; i--) {
lt = move(b, tmp, lb, i - 1);//位移除数
while (mycmp(a, tmp, la, lt) >= 0) {//比较a和tmp数组谁大,这样才能减
c[i]++;
sub(a, tmp, la, lt);//如果可以减就调用减法
}
//la--;错
}
while (c[lc] == 0 && lc > 1) lc--;
for (int i = lc; i >= 1; i--) {
cout << c[i];
}
cout << endl;
for (int i = la; i >= 1; i--) {
cout << a[i];//余下来就是减完之后的余数
}
return 0;
}