vlambda博客
学习文章列表

常用算法模板 | 高精度计算

高精度的输入输出

const int N = 1e5 + 10;
int a[N], b[N], c[N];

int main() {
string s;
cin >> s;

//输入
a[0] = s.size();
for (int i = 1; i <= a[0]; i ++ ) {
a[i] = s[a[0]-i] - '0';
}

//输出
for (int i = a[0]; i >= 1; i --) {
cout << a[i];
}

return 0;
}

高精度 a + 高精度 b = 高精度 c

void add(int a[], int b[], int c[]) {
int t = 0;
c[0] = max(a[0], b[0]);

for (int i = 1; i <= c[0]; i ++ ) {
t += a[i] + b[i];
c[i] = t % 10;
t /= 10;
}

if (t) c[++c[0]] = t;
while (!c[c[0]] && c[0] > 1) c[0] -- ;
}

高精度 a - 高精度 b = 高精度 c(大数 - 小数)

void sub(int a[], int b[], int c[]) {
int t = 0;
c[0] = a[0];

for (int i = 1; i <= c[0]; i ++ ) {
t = a[i] - b[i] - t;
c[i] = (t + 10) % 10;
t = t < 0 ? 1 : 0;
}
while (!c[c[0]] && c[0] > 1) c[0] -- ;
}

高精度比较

//如果高精度 a > 高精度 b,返回 1
//如果高精度 a < 高精度 b,返回 -1
//如果高精度 a = 高精度 b,返回 0
int cmp(int a[], int b[]) {
while (!a[a[0]] && a[0] > 1) a[0] -- ;
while (!b[b[0]] && b[0] > 1) 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;
}

高精度 a * 低精度 x = 高精度 c

void mul(int a[], int x, int c[]) {
int t = 0;
c[0] = a[0];

for (int i = 1; i <= c[0]; i ++ ) {
t += a[i] * x;
c[i] = t % 10;
t /= 10;
}

while (t) c[++c[0]] = t % 10, t /= 10;
while (!c[c[0]] && c[0] > 1) c[0] -- ;
}

高精度 a * 高精度 b = 高精度 c

void mul2(int a[], int b[], int c[]) {
for (int i = 1; i <= a[0]; i ++ ) {
int t = 0;
for (int j = 1; j <= b[0]; j ++ ) {
t += c[i+j-1] + a[i]*b[j];
c[i+j-1] = t % 10;
t /= 10;
}
if (t) c[i+b[0]] = t;
}

c[0] = a[0] + b[0];
while(!c[c[0]] && c[0] > 1) c[0] -- ;
}

高精度 a / 低精度 x = 高精度 c,余数为 r

void div(int a[], int x, int c[], int &r) {
r = 0;
c[0] = a[0];

for (int i = c[0]; i >= 1; i -- ) {
r = r * 10 + a[i];
c[i] = r / x;
r %= x;
}

while (!c[c[0]] && c[0] > 1) c[0] -- ;
}

高精度 a / 高精度 b = 高精度 c,余数为 a

void div2(int a[], int b[], int c[]) {
c[0] = max(a[0] - b[0] + 1, 1);

while(b[0] < a[0]) mul(b, 10, b);

for (int i = c[0]; i >= 1; i -- ) {
while (cmp(a,b) != -1) {
c[i] ++ ;
sub(a, b, a);
}
int r;
div(b, 10, b, r);
}

while (!c[c[0]] && c[0] > 1) c[0] -- ;
}



END



教学特点:

  • 线上小班授课,打好代码基础。避免大班课堂上学生要么“跟不上”,要么“吃不饱”的问题。

  • 教学经验丰富,熟悉学生的知识结构与学习能力,合理安排进度。

  • 以赛代练,通过考级与比赛,不断提高学生能力。




扫描二维码

咨询相关信息

中学生信竞