高精度乘法(C++,高精度)
采用IPO思路实现:
(1)I:
为了实现个位对齐、方便计算,将数字当作字符串读入,然后转为数字;
(2)P:
大致思路如下
采用二层循环实现,每次循环的操作:
sum_next += (a * b + sum) / 10;
sum = (a * b + sum) % 10;
(3)O:
输出结果即可
代码如下:
/* 高精度乘法 */
#include <iostream>
using namespace std;
const int max_len = 4096;int num[2][max_len] = { 0 };
int len[2] = { 0 };
int sum[max_len] = { 0 };void in_put() {string str[2];cin >> str[0] >> str[1];len[0] = str[0].size(); len[1] = str[1].size();for (int i = 0; i < 2; i++) {int i_1 = max_len - 1, i_2 = len[i] - 1;while (i_2 != -1) {num[i][i_1] = str[i][i_2] - '0';i_1--, i_2--;}len[i] = i_1;//边界判断}
}int calc() {for (int i = 0; i < 2; i++) {//*0特判if (len[i] == max_len - 2 && num[i][max_len - 1] == 0) {return max_len - 1;}}int i_1 = max_len - 1, i_2 = max_len - 1;while (i_1 > len[0]) {i_2 = max_len - 1;int bia = max_len - 1 - i_1;//偏移量while (i_2 > len[1]) {sum[i_2 - bia - 1] += (sum[i_2 - bia] + num[0][i_1] * num[1][i_2]) / 10;sum[i_2 - bia] = (sum[i_2 - bia] + num[0][i_1] * num[1][i_2]) % 10;i_2--;}i_1--;}int t = ++i_2 - (max_len - 1 - ++i_1) - 1;return sum[t] ? t : t + 1;//边界判断
}void out_put(int high) {while (high != max_len) {cout << sum[high++];}cout << endl;
}int main() {in_put();out_put(calc());return 0;
}
接下来说明一道例题
高精度求累加和
题目描述:
使用求和公式求1到N的累加(N最大可为100位的整数)
输入格式:
输入在一行中给出1个位数不超过100位的整数N。
输出格式:
对每一组输入,在一行中输出1+2+3+……+N的值。
输入样例:
10
输出样例:
55
解题思路:
看到题目可能会疑惑:累加和不是高精度加法吗?
然后看到题目描述就会明白,应该使用求和公式,所以实质上是高精度乘法
唯一需要注意的是就是sum / 2的操作了
while (i != max_len) {ans[i + 1] = (sum[i] % 2 ? 5 : 0);ans[i] += sum[i] / 2;i++;
}
思路形成了,接下来是代码的实现
只要将高精度乘法的输入部分稍微改动,然后再加上简单的除法处理就可以了
代码如下:
#include <iostream>
using namespace std;
const int max_len = 4096;int num[2][max_len] = { 0 };
int len[2] = { 0 };
int sum[max_len] = { 0 };
int ans[max_len + 1] = { 0 };void in_put() {string str;cin >> str;int i_1 = max_len - 1, i_2 = int(str.size()) - 1;while (i_2 != -1) {num[0][i_1] = num[1][i_1] = str[i_2] - '0';i_1--, i_2--;}len[0] = i_1;//边界判断i_1 = max_len - 1;num[1][i_1]++;while (num[1][i_1] / 10) {num[1][i_1 - 1] += num[1][i_1] / 10;i_1--;}len[1] = i_1 == len[0] ? len[0] - 1 : len[0];
}int calc() {for (int i = 0; i < 2; i++) {//*0特判if (len[i] == max_len - 2 && num[i][max_len - 1] == 0) {return max_len - 1;}}int i_1 = max_len - 1, i_2 = max_len - 1;while (i_1 > len[0]) {i_2 = max_len - 1;int bia = max_len - 1 - i_1;//偏移量while (i_2 > len[1]) {sum[i_2 - bia - 1] += (sum[i_2 - bia] + num[0][i_1] * num[1][i_2]) / 10;sum[i_2 - bia] = (sum[i_2 - bia] + num[0][i_1] * num[1][i_2]) % 10;i_2--;}i_1--;}int t = ++i_2 - (max_len - 1 - ++i_1) - 1;return sum[t] ? t : t + 1;
}int divi(const int high) {int i = high;while (i != max_len) {ans[i + 1] = (sum[i] % 2 ? 5 : 0);ans[i] += sum[i] / 2;i++;}return ans[high] ? high : high + 1;
}void out_put(int high) {while (high != max_len) {cout << ans[high++];}cout << endl;
}int main() {in_put();out_put(divi(calc()));return 0;
}
日志:
2022-10-28 发布
2023-1-10 改进思路和代码的实现
高精度乘法(C++,高精度)相关推荐
- (压位)高精度乘法,高精度加法,高精度减法,高精度除法
大值 乘 大值: 题目链接:https://www.luogu.com.cn/problem/P1303 # include <iostream> # include <string ...
- [转]高精度乘法计算
转载自: Daywei 高精度乘法计算 高精度乘法计算基础 1.高精度浮点运算方法 高精度浮点(Floating Point,FP)运算可以转换成整数型运算.由于高精度浮点数可以看成是由整数部分(In ...
- 朴素高精度乘法的常数优化
2015年辽宁省赛热身赛有一道高精度乘法 传送门:NEUOJ 1574 A*B 1574: A * B 时间限制: 10 Sec 内存限制: 128 MB 题目描述 Calculate $a \ti ...
- FFT实现高精度乘法
你应该知道$FFT$是用来处理多项式乘法的吧. 那么高精度乘法和多项式乘法有什么关系呢? 观察这样一个$20$位高精度整数$11111111111111111111$ 我们可以把它处理成这样的形式:$ ...
- /* program p5_04_AC 《聪明人的游戏提高篇》 1307:【例1.3】高精度乘法
/* program p5_04_AC <聪明人的游戏提高篇> 1307:[例1.3]高精度乘法 http://ybt.ssoier.cn:8088/problem_show.php?p ...
- 信息学奥赛一本通 1307:【例1.3】高精度乘法 | 1174:大整数乘法 | OpenJudge NOI 1.13 09:大整数乘法
[题目链接] ybt 1307:[例1.3]高精度乘法 ybt 1174:大整数乘法 OpenJudge NOI 1.13 09:大整数乘法 [题目考点] 1. 高精度 考察:高精乘高精 高精度计算讲 ...
- 信息学奥赛一本通(1307:【例1.3】高精度乘法)
1307:[例1.3]高精度乘法 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 30399 通过数: 10666 [题目描述] 输入两个高精度正整数M和N ...
- 算法提高 高精度乘法(java)
算法提高 高精度乘法 描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩 ...
- 国王游戏(贪心 + 高精度乘法 + 高精度除法 + 高精度比较大小)
题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏. 首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数. 然后,让这 n 位大臣排成一排,国王站在队伍 ...
- CCF NOI1140 高精度乘法
问题链接:CCF NOI1140 高精度乘法. 时间限制: 1000 ms 空间限制: 262144 KB 题目描述 给两个正整数a和b,计算它们的积. 输入 两行,每行一个数分别表示a和b(位数达 ...
最新文章
- 织梦cms php,织梦,cms,php,采集类
- Deep Learning的基础概念
- LDAP 中关于CN,OU,DC的含义
- 2021-06-19 sklearn中的线性回归模型
- ASML 发布2021年第三季度财报
- 关联规则完整源代码_接口测试:A06_HttpRunner关联_02_提取 SessionID:固定名称方式...
- geotools 读取shp属性过滤_Flink进阶之使用布隆过滤器实现UV统计
- C语言之pthread_cond_wait()和pthread_cond_timedwait()区别(十五)
- w3c html.css,W3C教程(6):W3C CSS 活动
- 再谈删除数据的SQL语句
- c语言变量类型char,C语言中char变量详解
- 如果你不释放MogaFX外汇,你将无法获得交易或投资
- Nlp SBD 文本断句 包含中文 和英文断句
- 学习路之html--“加入收藏夹“和“设为首页“
- 查看docker镜像中的文件
- VUE三目运算使用 :style与:class
- 2019最新《布尔教育php设计模式项目实战 共17课》
- ckeditor5使用
- 使用cloudcompare使xy轴的值反过来
- java计算机毕业设计销售合同管理系统源码+lw文档+系统+数据库
热门文章
- MySQL学习笔记-B站动力节点
- pc上火车票抢票神器
- s400x ugee 驱动_友基手写板驱动下载_友基手写板驱动官方下载-太平洋下载中心...
- USBCAN在江淮新能源汽车诊断工具的应用案例
- Python爬取国家统计局官网最新全国所有城市县镇数据
- 微赞config.修改php,微信公众号第三方平台 微赞WZ_V100.0版20170612整合包 整合人人商城V2新版+一键升级...
- fiddle 基本快捷键
- Drivers: CH340和CH341系列
- 【无标题】C语言for循环输出字符数组
- Unity VR:如何获得手柄的按键信息