[C++] 高精度乘法

目录


注意: 若还没有学过高精度运算的话先去看高精度加法


引入: 大整数比较

比较方法

大整数比较可以使用此方法比较(注释有讲解):

cpp 复制代码
/*
如果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:

复制代码
 5
 12
 10
 1
 15
 100
 3

output:

复制代码
2

AC代码

cpp 复制代码
#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;
}

高精度乘法模版

cpp 复制代码
/*
高精度*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]--;
}

高精度运算小合集(这集乘法+上集加法)

cpp 复制代码
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]--;
}
相关推荐
kyle~20 小时前
算法数学---差分数组(Difference Array)
java·开发语言·算法
橘颂TA20 小时前
机器人+工业领域=?
算法·机器人
滨HI020 小时前
C++ opencv拟合直线
开发语言·c++·opencv
艾莉丝努力练剑20 小时前
【C++:红黑树】深入理解红黑树的平衡之道:从原理、变色、旋转到完整实现代码
大数据·开发语言·c++·人工智能·红黑树
No0d1es21 小时前
电子学会青少年软件编程(C/C++)1级等级考试真题试卷(2025年9月)
java·c语言·c++·青少年编程·电子学会·真题·一级
_OP_CHEN21 小时前
C++进阶:(七)红黑树深度解析与 C++ 实现
开发语言·数据结构·c++·stl·红黑树·红黑树的旋转·红黑树的平衡调整
小O的算法实验室21 小时前
2025年TRE SCI1区TOP,随机环境下无人机应急医疗接送与配送的先进混合方法,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
kyle~21 小时前
计算机系统---USB的四种传输方式
运维·c++·计算机系统
小白程序员成长日记21 小时前
2025.11.06 力扣每日一题
算法·leetcode
不穿格子的程序员21 小时前
从零开始写算法-栈-最小值(记忆化pair)
数据结构·