这算是本BLOG的第一篇文章吧,算法这一块荒废了很长时间,,这份代码刚开始写的时候,刚输完main时,整个人都是蒙的,不知该如何往下走。

好在成功写完了。由于没啥状态,所以这个高精+功能非常简单,只能+,不支持负数。

这里说一下位压的思想,一般的评测机都是32位的,所以一个int能储存32位数据。

再来看一看0 ~ 9,二进制分别对应0000~1001,所以一个4位二进制正好可以存储,所以这里就4位存一个数字,32位正好8个。

首先来设计输入函数:

inline bool read (int & ret, int bit) {//存到一个32位整数里int c = getchar();if (c < '0' || c > '9') return 0;c = c - '0';c <<= (bit << 2); //bit * 4ret |= c;return 1;//该数是否读取成功,用于while的结束
}

返回一个bool,表示当前输入是否成功,一般返回也就代表一行输入完了。
函数思想和快速读入差不多,也是getchar,然后变成整数。一个int可以存8个数字,其中参数bit(新京报命名)表示存为第几位数字。

读写好了,接下来就是取,取数字的话分为两种:

  1. 对于一个单独的int取数
  2. 对于一整个(高精度)数组取数

第一种比较好实现,但是会出一小点点问题:

inline void get_num (int n_arr, int bit, int & ret) {//取数字ret = (n_arr >> (bit << 2)) & 15;
}

因为我们存数字是从高位开始读取的,高位的数字优先存储在int中的低位
比如我输入1234,读取函数返回的int为171855,二进制为0100 0011 0010 0001,十六进制为4321

可以看到正好反过来了,所以我们搞不清楚某一个int中到底存储了多少个有效数字。

这种存储方式中,1234和12340的int值是相等的,不过我们可以通过记录每一个高精度数字的总位数来避免这种情况,理由是:

  1. 只要不是高精数的最后几位不满8个数的,其他高位上的int都能存储8位整数
  2. 当某个int存储了不到8个数时,往前(高位)的位都是全0填充

所以只要单开两个变量存储数字的总位数即可。

先讲讲第二种取数字

inline void get_arr_num(int * arr, int bit, int & ret) {//对一个高精度数字取出某一位-- bit;int a = bit / 8, b = bit - a * 8;get_num (arr[a], b, ret);
}

这里数字位数是从1开始的,注意。。

参数的解释:arr数组表示某一个高精度数,bit是取这个高精度数字的第几位,最高位是1,依次往下。ret就是返回。。。

a代表要取的数字在第几个数组里,向下取整,因为高位数字在数组中的下标更小,b表示该位数字存储在32位int中的第几个。

最后最后,就是main了,主函数中包含了这几个部分:

  1. 读入两个高精度操作数
  2. 循环开始从这两个数字的最低位相加,一直加到最大的那个数的最高位
  3. 保存结果,输出

这里直接放全部的代码吧。。

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;int num_a [505];
int num_b [505];inline bool read (int & ret, int bit) {//存到一个32位整数里int c = getchar();if (c < '0' || c > '9') return 0;c = c - '0';c <<= (bit << 2); //bit * 4ret |= c;return 1;//该数是否读取成功,用于while的结束
}inline void get_num (int n_arr, int bit, int & ret) {//取数字ret = (n_arr >> (bit << 2)) & 15;
}/*inline int get_num_long (int n) {//查询一个数字中的有效数字存储个数int r = 8,z = 15 << 28;while (!(n & z)) {-- r;z >>= 4;}return r;
}*/inline void get_arr_num(int * arr, int bit, int & ret) {//对一个高精度数字取出某一位-- bit;int a = bit / 8, b = bit - a * 8;get_num (arr[a], b, ret);
}int main () {int b_p = 0, l_p = 0;int a_l = 0, b_l = 0;while (read (num_a [b_p], l_p)) {//读取数字a++ l_p; a_l ++;if (l_p == 8) {l_p = 0;++ b_p;}}b_p = 0, l_p = 0;while (read (num_b [b_p], l_p)) {//读取数字b++ l_p; b_l ++;if (l_p == 8) {l_p = 0;++ b_p;}}string OP;//OutPutint Cin = 0;//进位int a, b, c;//a的某位,b的某位,c=a+bfor (int i = a_l,j = b_l; (i > 0) | (j > 0); -- i, -- j) {//最低位开始相加if (i > 0) {get_arr_num (num_a, i, a);} else { //判断是否超出最高位a = 0;}if (j > 0) {get_arr_num (num_b, j, b);} else {b = 0;}c = a + b + Cin;if (c >= 10) {//是否进位Cin = 1;OP = (char) (c - 10 + '0') + OP;} else {Cin = 0;OP = (char) (c + '0') + OP;}}if (Cin) cout << '1';//判断最高位是否进位cout << OP;return 0;
}

当然,所有的思想都是自己想出来的,这份代码也只是临时起意,并没有经过评测,仅供参考,如有BUG,也算正常,还请指点

[位压] 高精度加法相关推荐

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

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

  2. PAT甲级1023 Have Fun with Numbers:[C++题解]高精度加法和两个vector大小比较

    文章目录 题目分析 题目链接 题目分析 使用高精度加法高精度加法板子求 这个数的两倍,存在一个vector中. 所谓高精度就是使用string来存大的数,然后模拟列竖式加法,结果一位一位压入数组vec ...

  3. 基础练习 高精度加法

    基础练习 高精度加法 时间限制:1.0s 内存限制:512.0MB 问题描述 输入两个整数a和b,输出这两个整数的和.a和b都不超过100位. 算法描述 由于a和b都比较大,所以不能直接使用语言中的标 ...

  4. 高精度加法(C++实现)

    高精度加法 简介 用于计算含有超过一般变量存放不下的非负整数 高精度加法这个过程是模拟的小学竖式加法计算 步骤 以下有顺序之分 数组清零 输入 获取长度 逆置 字符型数字转成对应的整型数字 计算并输出 ...

  5. 高精度加法(非负)和大数阶乘及和汽水问题

    高精度加法(非负)和大数阶乘 文章目录 高精度加法(非负)和大数阶乘 一.问题描述 二.代码 三.问题描述 四.代码 五.问题描述 六.代码 一.问题描述 二.代码 #define _CRT_SECU ...

  6. 高精度加法(A+BProblemII)

    好久没有写文章了,主要是近期开学上网课再加上刷题的缘故,日常有些忙碌. 话不多说,接下来是正题: 一切问题都是有源头的,在这里我就直接先放题了. 接下来我以代码+部分代码的解释+注意事项进行 ps:( ...

  7. CCF NOI1138 高精度加法

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

  8. 高精度加法 高精度减法 高度除法 高精度乘法 方法总结

    一.引言 对于数字的储存,用实数类型总会有一些不足,比如: 使用int 只能最多存储4个字节,范围也就是2的32次方: 使用double 只能最多储存8字节,就是2的64次方: 如果数字超过这个限制, ...

  9. 高精度加法(C语言实现)

    高精度,是学C语言漫长的路上必须要学的一类程序 >>>高精度模板( 加,减,乘低精高精,除低精高精(有余数),高精阶乘(200000以内) ) (C语言实现)(注释多多)<&l ...

最新文章

  1. PPLcnet和YOLO的碰撞,真的能在cpu上快到起飞?
  2. JavaScript是如何同时做到单线程和异步执行的
  3. python演示验证图像叠加过程_Python叠加矩形框图层2种方法及效果代码实例
  4. Jedis对redis的操作详解
  5. SAP成都研究院廖婧:SAP C4C社交媒体集成概述
  6. yii2中的rules验证规则
  7. PID控制器改进笔记之三:改进PID控制器之正反作用
  8. mysql port range_MySQL 数据库常见调优方法及参数设置_MySQL
  9. XBMC不能看搜狐电视剧
  10. python爬取小说写入txt_Python BeautifulSoup 爬取笔趣阁所有的小说
  11. 【Java】进制转换器的实现
  12. Python基础----NumPy
  13. datetimepicker一个不错的日历android特效
  14. 遍历python字典几种方法
  15. 创建查看mysql8.0数据库_创建和选择数据库
  16. oracle 删掉同义词,【oracle删除同义词】作文写作问答 - 归教作文网
  17. 计算机中cpu是指什么意思,CPU是什么?CPU又是什么意思?
  18. 为什么HashMap使用红黑树而不使用AVL树
  19. xcode 项目 was compiled with optimization -stepping may behave oddly ;variable may not be available
  20. 结构体所占字节数的计算

热门文章

  1. 【无标题】申请测绘资质的详细流程及所需详细资料有哪些?
  2. BT源代码学习心得(二):程序运行参数的获取 -- 转贴自 wolfenstein (NeverSayNever)
  3. 淘宝订单、API获取订单
  4. 揭秘信用卡职业养卡人:月赚两万如何办到
  5. 关于SVG图片鼠标变为小手
  6. Python视觉深度学习系列教程 第三卷 第9章 Kaggle竞赛:情绪识别
  7. php inpo,优化PHP in_array()函数,效率提高50倍
  8. 笔记1-2020-07-30
  9. 【《Unity 2018 Shaders and Effects Cookbook》翻译提炼】(九)Physically - Based Rendering
  10. [linux学习笔记] GCC环境安装问题