<—点个赞吧QwQ
宣传一下算法基础课整理{:target=”_blank”}
给定两个非负整数(不含前导 $0$) $A,B$,请你计算 $A / B$ 的商和余数。
输入格式
共两行,第一行包含整数 $A$,第二行包含整数 $B$。
输出格式
共两行,第一行输出所求的商,第二行输出所求余数。
数据范围
$1 \\le A的长度 \\le 100000$,
$1 \\le B \\le 10000$,
$B$ 一定不为 $0$
输入样例:
7
2
输出样例:
3
1
思路1
高精度模板,超实用!!!
稍微有亿点麻烦的模拟。。。
代码1
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
struct bigint {
int num[N];
int len;
bigint () {
len = 1;
memset (num,0,sizeof (num));
}
};
void chg (string s,bigint &a) {
int len = s.size ();
for (int i = 1;i <= len;i++) {
a.num[i] = s[len-i]-'0';
}
a.len = len;
}
bigint operator / (bigint a,int b) {
bigint c;
int len = 0,r = 0;
for (int i = a.len;i >= 1;i--) {
r = r*10+a.num[i];
c.num[++len] = r/b;
r %= b;
}
reverse (c.num+1,c.num+1+len);
while (c.num[len] == 0 && len > 1) len--;
c.len = len;
return c;
}
bigint operator - (bigint a,bigint b) {
int len = a.len;
for (int i = 1;i <= len;i++) {
if (a.num[i] < b.num[i]) {
a.num[i] += 10;
a.num[i+1]--;
}
a.num[i] -= b.num[i];
}
while (a.num[len] == 0 && len > 1) len--;
a.len = len;
return a;
}
bigint operator * (bigint a,bigint b) {
bigint c;
int len = a.len+b.len;
for (int i = 1;i <= a.len;i++) {
for (int j = 1;j <= b.len;j++) {
c.num[i+j-1] += a.num[i]*b.num[j];
c.num[i+j] += c.num[i+j-1]/10;
c.num[i+j-1] %= 10;
}
}
while (c.num[len] == 0 && len > 1) len--;
c.len = len;
return c;
}
bigint operator * (bigint a,int b) {
bigint c;
int len = 0;
while (b) {
c.num[++len] = b%10;
b /= 10;
}
c.len = len;
return a*c;
}
void print (bigint a) {
for (int i = a.len;i >= 1;i--) cout << a.num[i];
cout << endl;
}
bigint operator % (bigint a,int b) {
return a-a/b*b;
}
string s1;
int b,r;
bigint a;
int main () {
cin >> s1 >> b;
chg (s1,a);
print (a/b);
print (a%b);
return 0;
}
思路2
这里给出一份高精除以高精的代码。
代码2
详见高精度模板
稍微有亿点麻烦的模拟。。。