C++知识点总结(6):高精度乘法

一、高精度数 × 低精度数

1. 输入两个数字

char a_str[1005] = {};
long long b;
cin >> a_str >> b;

2. 将高精度数转换为整型

int a[1005] = {};
int len_a = strlen(a_str);
for (int i = 0; i <= len_a-1; i++)
{a[len_a-i-1] = a_str[i] - 48;
}

3. 计算

int len_ans = len_a;
long long ans[1005] = {};
long long in = 0;
for (int i = 0; i <= len_ans-1; i++)
{ans[i] = a[i] * b + in; // 存储数字 in = ans[i] / 10; // 得到进位 ans[i] %= 10; // 在对应的数位上保留实际得数的最后一位 
}

4. 输出结果

while (in > 0) // 最高位处理 
{ans[len_ans] = in % 10;len_ans++;in /= 10;
}// 正常输出 
for (int i = len_ans - 1; i >= 0; i--)
{cout << ans[i]; 
}

5. 注意一个特例先行

if (a == 0 || b == 0)
{cout << 0;return 0;
} 

6. 完整代码

#include <iostream>
#include <cstring>
using namespace std;int main()
{// 存储并输出两个数字 char a_str[1005] = {};long long b;cin >> a_str >> b;// 特例先行:结果是0的情况if (a == 0 || b == 0){cout << 0;return 0;} // 转换第一个高精度数 int a[1005] = {};int len_a = strlen(a_str);for (int i = 0; i <= len_a-1; i++){a[len_a-i-1] = a_str[i] - 48;}// 计算int len_ans = len_a;long long ans[1005] = {};long long in = 0;for (int i = 0; i <= len_ans-1; i++){ans[i] = a[i] * b + in; // 存储数字 in = ans[i] / 10; // 得到进位 ans[i] %= 10; // 在对应的数位上保留实际得数的最后一位 }// 输出结果 while (in > 0) // 最高位处理 {ans[len_ans] = in % 10;len_ans++;in /= 10;}// 正常输出 for (int i = len_ans - 1; i >= 0; i--){cout << ans[i]; }return 0;
}
/*
注明:
由于是从编译器中复制过来的,所以缩进有些难看,大家可以自行调整(复制到本地编译器还是可以的)。
*/

二、高精度数 × 高精度数

        计算思路改变了一些,其他不变。

#include <iostream>
#include <cstring>
using namespace std;int main()
{// 存储并输出两个数字 char a_str[1005] = {};char b_str[1005] = {};cin >> a_str >> b_str;// 转换高精度数 int a[1005] = {};int b[1005] = {};int len_a = strlen(a_str);int len_b = strlen(b_str);for (int i = 0; i <= len_a-1; i++){a[len_a-i-1] = a_str[i] - 48;}for (int i = 0; i <= len_b-1; i++){b[len_b-i-1] = b_str[i] - 48;}// 计算int ans[2010] = {};int in = 0;for (int j = 0; j <= len_b-1; j++){for (int i = 0; i <= len_a-1; i++){ans[i+j] = a[i] * b[j] + in + ans[i+j];in = ans[i+j] / 10;ans[i+j] %= 10; } // 最高位处理 ans[len_a+j] = in;in = 0; // 重置进位}// 正常输出int len_ans = len_a + len_b; // 结果的最大位数// 前导0while (ans[len_ans-1] == 0 && len_ans > 1){len_ans--;}for (int i = len_ans - 1; i >= 0; i--){cout << ans[i]; }return 0;
}

三、高精度平方计算器

        首先我们要知道,n的平方(记作n²)相当于n ×n,其实我们可以按照高精度数 × 高精度数的思想来完成。

  •  想法1:将所有b都改为a。
  •  想法2:使用strcpy()函数直接将a的值赋值给b。

        建议采用想法2,示例代码如下:

#include <iostream>
#include <cstring>
using namespace std;int main()
{// 存储并输出两个数字 char a_str[1005] = {};char b_str[1005] = {};cin >> a_str;strcpy(b_str, a_str);// 转换高精度数 int a[1005] = {};int b[1005] = {};int len_a = strlen(a_str);int len_b = strlen(b_str);for (int i = 0; i <= len_a-1; i++){a[len_a-i-1] = a_str[i] - 48;}for (int i = 0; i <= len_b-1; i++){b[len_b-i-1] = b_str[i] - 48;}// 计算int ans[2010] = {};int in = 0;for (int j = 0; j <= len_b-1; j++){for (int i = 0; i <= len_a-1; i++){ans[i+j] = a[i] * b[j] + in + ans[i+j];in = ans[i+j] / 10;ans[i+j] %= 10; } // 最高位处理 ans[len_a+j] = in;in = 0; // 重置进位}// 正常输出int len_ans = len_a + len_b; // 结果的最大位数// 前导0while (ans[len_ans-1] == 0 && len_ans > 1){len_ans--;}for (int i = len_ans - 1; i >= 0; i--){cout << ans[i]; }return 0;
}

四、高精度阶乘计算器

        注释已经详细地注明了,大家自己看一看即可。

#include <iostream>
#include <cstring>
using namespace std;int main()
{// 输入int n;cin >> n;// 初始化计算相关变量 int in = 0;int ans[10005] = {1};int len_ans = 1;// 计算阶乘for (int num = 1; num < n; num++) // num是对应的因数(即3! = 1 * 2 * 3中的1、2、3){// 高精度数 ×低精度数代码 for (int i = 0; i <= len_ans-1; i++) {ans[i] = ans[i] * num + in; // ans[i] = 上一轮的结果 * 下一个因数 + 上一次的进位 in = ans[i] / 10;ans[i] %= 10;}while (in){ans[len_ans] = in % 10;len_ans++;in /= 10;}}for (int i = 1; i <= len_ans; i++){cout << ans[i];}return 0;
} 

今日收获

        这样,高精度就只剩下下周要研究的高精度除法啦( ̄︶ ̄)加油!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/191992.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++之set/multise容器

C之set/multise容器 set基本概念 set构造和赋值 #include <iostream> #include<set> using namespace std;void PrintfSet(set<int>&s) {for(set<int>::iterator it s.begin();it ! s.end();it){cout<<*it<<" ";}cout&l…

解决/usr/lib/libstdc++.so.6: version `GLIBCXX_3.x.x‘ not found问题

目录 1、查找缺少库版本2、动态库版本与gcc版本对应关系3、查找 libstdc.so.6.0.x 库文件4、如果libstdc.so.6.0.21库文件已存在&#xff0c;则按照下面的步骤创建软链接即可4.1 拷贝、软连接4.2验证新的 libstdc.so.6.0.21 库文件是否生效 5、如果libstdc.so.6.0.21库文件不存…

Web前端—移动Web第二天(空间转换、动画、综合案例:全名出游)

版本说明 当前版本号[20231118]。 版本修改说明20231118初版 目录 文章目录 版本说明目录移动 Web 第二天01-空间转换空间转换简介平移视距旋转左手法则rotate3d-了解立体呈现案例-3d导航缩放 02-动画动画实现步骤animation复合属性animation拆分写法案例-走马灯精灵动画多组…

x程无忧sign逆向分析

x程无忧sign逆向分析&#xff1a; 详情页sign&#xff1a; 详情页网站&#xff1a; import base64 # 解码 result base64.b64decode(aHR0cHM6Ly9qb2JzLjUxam9iLmNvbS9ndWFuZ3pob3UvMTUxODU1MTYyLmh0bWw/cz1zb3Vfc291X3NvdWxiJnQ9MF8wJnJlcT0zODQ4NGQxMzc2Zjc4MDY2M2Y1MGY2Y…

数位和相等数对的最大和【教3妹学编程-算法题】数位和相等数对的最大和

3妹&#xff1a;2哥&#xff0c;你有没有看到新闻“18岁父亲为4岁儿子落户现身亲子鉴定” 2哥 : 啥&#xff1f;18岁就当爹啦&#xff1f; 3妹&#xff1a;确切的说是14岁好吧。 2哥 : 哎&#xff0c;想我30了&#xff0c; 还是个单身狗。 3妹&#xff1a;别急啊&#xff0c; 2…

Git命令总结-常用-后续使用频繁的再添加~

Git命令总结-常用 久了不用&#xff0c;有些时候老是会忘记一些命令&#xff0c;多的都记录一下&#xff0c;方便查找 git init 初始化一个Git仓库&#xff0c;执行完git init命令后&#xff0c;会生成一个**.git**目录&#xff0c;该目录包含了资源数据&#xff0c;且只会在…

linux版:TensorRT安装教程

首先安装cuda和cudnn 查看安装的cuda版本 nvidia-smi查看cuda电脑的版本&#xff0c;我的是11.8版本的 nvcc -V查看cudnn版本&#xff0c;在cuda/cuda118/include路径下 cat cudnn_version.h | grep CUDNN_MAJOR -A 2下载TensorRT8.5 GA 下载地址&#xff1a;https://deve…

安装银河麒麟linux系统docker(docker-compose)环境,注意事项(一定能解决,有环境资源)

1:安装docker环境必须使用麒麟的版本如下 2:使用docker-compse up -d启动容器遇到的文件 故障1:如果运行docker-compose up 报“Cannot create redo log files because data files are corrupt or the database was not shut down cleanly after creating the data files”…

Mysql -常见函数

目录 字符串函数 数值函数 日期函数 流程函数 字符串函数 -- 拼接 SELECT CONCAT(Hello, World); -- 小写 SELECT LOWER(Hello); -- 大写 SELECT UPPER(Hello); -- 左填充 SELECT LPAD(01, 5, -); -- 右填充 SELECT RPAD(01, 5, -); -- 去除空格 SELECT TRIM( Hello World )…

Docker安装Zookeeper

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

首发|PS 2024 正式版来袭,内置AI神经滤镜,支持Win/Mac

前言 Photoshop 2024应用程序发布了生成式AI绘图&#xff0c;这是世界上第一个创意和设计工作流程的软件&#xff0c;为用户提供了一种神奇的新工作方式。生成式AI绘图由Adobe Firefly提供支持&#xff0c;Adobe的创意生成AI模型系列。 正文简介 Photoshop 2024正式版 支持…

中国净初级生产力年度合成产品NPP(MYD17A3H.006)

中国净初级生产力年度合成产品NPP&#xff08;MYD17A3H.006&#xff09;由航天宏图实验室提供&#xff0c;根据NASA MODIS数据&#xff08;MYD17A3H.006&#xff09;通过航天宏图 Smoother计算得到的平滑后NPP产品&#xff0c;解决了影像云雾覆盖、像元异常值等问题。对处理后的…