[C++] 高精度乘法
目录
- 引入: 大整数比较
- 比较方法
- 例题1-青蛙计数
- 题目描述
- 输入描述
- 输出描述
- 输入输出样例
- AC代码
- 高精度乘法模版
- 高精度运算小合集(这集乘法+上集加法)
注意: 若还没有学过高精度运算的话先去看高精度加法
引入: 大整数比较
比较方法
大整数比较可以使用此方法比较(注释有讲解):
/*
如果x比y小, 则返回true
否则(y >= x)返回false
*/
bool cmpBIG(int x[], int y[]){int lx = x[0], ly = y[0] // 获取x和y的有效长度if(lx != ly) return lx < ly; // 数位多者大for(int i = lx; i >= 1; i--){ // 大数逆向存储, 逆向遍历获得依次正向的数据if(x[i] != y[i]) return x[i] < y[i];}return false; // 两个数组完全相同
}
例题1-青蛙计数
题目描述
现在皮皮有n
个数和一个幸运数m
, 希望你统计一下这n
个数中有多少个数不小于m
.
输入描述
第 1 行,一个整数n
,表示有n
个数;
第 2 行,一个整数m
,表示幸运数;
第 3~n
+2 行有 n 个数a[i]
, 表示每个数
输出描述
输出只有一个整数ans
表示有ans
个数不小于m
。
输入输出样例
input:
512101151003
output:
2
AC代码
#include <iostream>
#include <string>
#include <cstring>
using namespace std;bool cmpBIG(int x[], int y[]){int lx = x[0], ly = y[0];if(lx != ly) return lx < ly;for(int i = lx; i >= 1; i--){if(x[i] != y[i]) return x[i] < y[i];}return false;
}void s2BIG(string s, int a[]){int len = s.size();for(int i = 1; i <= len; i++){a[i] = s[len - i] - '0';}a[0] = len;
}int m[1010];
int a[1010];int main(){int n, cnt = 0;cin >> n;string m2;cin >> m2;s2BIG(m2, m);for(int i = 1; i <= n; i++){string s;cin >> s;s2BIG(s, a);if(!(cmpBIG(a, m))){cnt++;}memset(a, 0, sizeof(a));}cout << cnt;return 0;
}
高精度乘法模版
/*
高精度*int
*/
void mulBIG(int x[], int y, int z[]){z[0] = x[0];for(int i = 1; i <= z[0]; i++) z[i] = x[i] * y;for(int i = 1; i <= z[0]; i++){z[i + 1] += z[i] / 10;z[i] = z[i ] % 10;if(z[z[0] + 1] > 0) z[0]++;}while(z[0] > 1 && z[z[0]] == 0) z[0]--;
}
高精度运算小合集(这集乘法+上集加法)
void s2BIG(string s, int a[]){int len = s.size();for(int i = 1; i <= len; i++){a[i] = s[len - i] - '0';}a[0] = len;
}void i2BIG(int n, int a[]){int cur = 0;while(n > 0){cur++;a[cur] = n % 10;n /= 10;}if(cur == 0) cur++;a[0] = cur;
}void printBIG(int a[]){int len = a[0];for(int i = len; i > 0; i--){cout << a[i];}cout << endl;
}void addBIG(int x[], int y[], int z[]){z[0] = max(x[0], y[0]);for(int i = 1; i <= z[0]; i++)z[i] = x[i] + y[i];for(int i = 1; i <= z[0]; i++){ z[i + 1] += z[i] / 10;z[i] %= 10;if(z[z[0] + 1] != 0)z[0]++;}
}/*
高精度*int
*/
void mulBIG(int x[], int y, int z[]){z[0] = x[0];for(int i = 1; i <= z[0]; i++) z[i] = x[i] * y;for(int i = 1; i <= z[0]; i++){z[i + 1] += z[i] / 10;z[i] = z[i ] % 10;if(z[z[0] + 1] > 0) z[0]++;}while(z[0] > 1 && z[z[0]] == 0) z[0]--;
}