采用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++,高精度)相关推荐

  1. (压位)高精度乘法,高精度加法,高精度减法,高精度除法

    大值 乘 大值: 题目链接:https://www.luogu.com.cn/problem/P1303 # include <iostream> # include <string ...

  2. [转]高精度乘法计算

    转载自: Daywei 高精度乘法计算 高精度乘法计算基础 1.高精度浮点运算方法 高精度浮点(Floating Point,FP)运算可以转换成整数型运算.由于高精度浮点数可以看成是由整数部分(In ...

  3. 朴素高精度乘法的常数优化

    2015年辽宁省赛热身赛有一道高精度乘法 传送门:NEUOJ 1574 A*B 1574: A * B 时间限制: 10 Sec  内存限制: 128 MB 题目描述 Calculate $a \ti ...

  4. FFT实现高精度乘法

    你应该知道$FFT$是用来处理多项式乘法的吧. 那么高精度乘法和多项式乘法有什么关系呢? 观察这样一个$20$位高精度整数$11111111111111111111$ 我们可以把它处理成这样的形式:$ ...

  5. /* program p5_04_AC 《聪明人的游戏提高篇》 1307:【例1.3】高精度乘法

    /* program p5_04_AC <聪明人的游戏提高篇>  1307:[例1.3]高精度乘法 http://ybt.ssoier.cn:8088/problem_show.php?p ...

  6. 信息学奥赛一本通 1307:【例1.3】高精度乘法 | 1174:大整数乘法 | OpenJudge NOI 1.13 09:大整数乘法

    [题目链接] ybt 1307:[例1.3]高精度乘法 ybt 1174:大整数乘法 OpenJudge NOI 1.13 09:大整数乘法 [题目考点] 1. 高精度 考察:高精乘高精 高精度计算讲 ...

  7. 信息学奥赛一本通(1307:【例1.3】高精度乘法)

    1307:[例1.3]高精度乘法 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 30399     通过数: 10666 [题目描述] 输入两个高精度正整数M和N ...

  8. 算法提高 高精度乘法(java)

    算法提高 高精度乘法 描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩 ...

  9. 国王游戏(贪心 + 高精度乘法 + 高精度除法 + 高精度比较大小)

    题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏. 首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数. 然后,让这 n 位大臣排成一排,国王站在队伍 ...

  10. CCF NOI1140 高精度乘法

    问题链接:CCF NOI1140 高精度乘法. 时间限制: 1000 ms  空间限制: 262144 KB 题目描述 给两个正整数a和b,计算它们的积. 输入 两行,每行一个数分别表示a和b(位数达 ...

最新文章

  1. 织梦cms php,织梦,cms,php,采集类
  2. Deep Learning的基础概念
  3. LDAP 中关于CN,OU,DC的含义
  4. 2021-06-19 sklearn中的线性回归模型
  5. ASML 发布2021年第三季度财报
  6. 关联规则完整源代码_接口测试:A06_HttpRunner关联_02_提取 SessionID:固定名称方式...
  7. geotools 读取shp属性过滤_Flink进阶之使用布隆过滤器实现UV统计
  8. C语言之pthread_cond_wait()和pthread_cond_timedwait()区别(十五)
  9. w3c html.css,W3C教程(6):W3C CSS 活动
  10. 再谈删除数据的SQL语句
  11. c语言变量类型char,C语言中char变量详解
  12. 如果你不释放MogaFX外汇,你将无法获得交易或投资
  13. Nlp SBD 文本断句 包含中文 和英文断句
  14. 学习路之html--“加入收藏夹“和“设为首页“
  15. 查看docker镜像中的文件
  16. VUE三目运算使用 :style与:class
  17. 2019最新《布尔教育php设计模式项目实战 共17课》
  18. ckeditor5使用
  19. 使用cloudcompare使xy轴的值反过来
  20. java计算机毕业设计销售合同管理系统源码+lw文档+系统+数据库

热门文章

  1. MySQL学习笔记-B站动力节点
  2. pc上火车票抢票神器
  3. s400x ugee 驱动_友基手写板驱动下载_友基手写板驱动官方下载-太平洋下载中心...
  4. USBCAN在江淮新能源汽车诊断工具的应用案例
  5. Python爬取国家统计局官网最新全国所有城市县镇数据
  6. 微赞config.修改php,微信公众号第三方平台 微赞WZ_V100.0版20170612整合包 整合人人商城V2新版+一键升级...
  7. fiddle 基本快捷键
  8. Drivers: CH340和CH341系列
  9. 【无标题】C语言for循环输出字符数组
  10. Unity VR:如何获得手柄的按键信息