当前位置: 首页 > ds >正文

[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]--;
}
http://www.xdnf.cn/news/2424.html

相关文章:

  • 八猴渲染器三维场景实时预览软件 Marmoset Toolbag 5.01 安装包免费下载
  • 九、内联函数(Inline Functions)
  • 《Keras 3部署全攻略:从新手到实战高手》
  • 网络流之最大流(Dinic)
  • Springboot基础篇
  • 牛客:链表内指定区间反转
  • 在 Ubuntu24.04 LTS 上 Docker 部署英文版 n8n 和 部署中文版 n8n-i18n-chinese
  • 前端自定义文本生成文件下载
  • 第八章 IO流
  • 树状数组详解
  • ZBrush2025建模软件下载 ZBrush中文版免费下载 ZBrush版本大全
  • 数据预处理中比较重要的知识点
  • 【白雪讲堂】
  • CPU与GPU的功能与区别解析
  • 【LCMM】纵向轨迹模型,组轨迹模型
  • c++学习小结
  • AUTOSAR图解==>AUTOSAR_SWS_StandardTypes
  • PotPlayer,强大的高清视频播放器
  • 使用 Spring Boot 进行开发
  • TypeScript基础数据类型详解
  • 多数元素(简单)
  • VSCode远程登录云服务器并设置免密登录全攻略
  • java每日精进 4.26【多租户之过滤器及请求处理流程】
  • llama factory怎么命令行推理图片
  • java—基础
  • A. Everybody Likes Good Arrays!
  • Java 程序运行和类路径处理
  • map和set的应用总结
  • MySQL 常用语句教程
  • Python数值类型修炼手册:从青铜到王者的进阶之路