高效万进制——蓝桥杯|HDOJ 1002 大数加法——30行代码AC
浅谈进制思想:
日常生活中我们习惯用十进制去运算;
为了方便电脑识别开发出了二进制,又因为2^3=8 , 2^4=16,因此应运而生了八进制与16进制。
世上本没有路,走的人多了,也便成了路,那么既然二进制可以衍生出8,16进制,为什么十进制不可以呢。
因此聪明的人们开发出了万进制,也就是10^4=10000 模仿二进制与十六进制的运算。渐渐的,我们发现万进制在进行大数运算方面有着无可比拟的优势。
如:662343889 * 5 = 3311719445
那么如果用万进制计算:可以设一个数组a[3]; a[2] = 3889 ; a[1] = 6234 ; a[0] = 6 ;
第一步:a[2] * 5 = 19445 ; 19445 %10000 = 1余9445 9445留下,1进位;
第二步:a[1] * 5 = 31170 ; 31170 %10000 = 3余1170 1170留下,加上进位的1为1171(终值),3进位;
第三步:a[0] * 5 = 30 ; 30+3(进位)为终值。
按顺序输出得:3311719945 ;仅仅三步我们便得出了最后结果,如果用十进制呢?每位相加,对于本例,至少要十步吧。效率快了3倍不止。
注意点:
本题 严格 模拟手算。(见11行-19行代码)
1、本题用万能头文件代替#include<iostream>
和#include<iomanip>
。
传送门→万能头文件
2、万进制逢万进一,效率极高,日后做ACM也是非常优秀的代码。
3、用cin输入char型数组,a[strlen(a)]的值为空, 一定要补0!见第九行代码。(笔者被坑的很惨)
4、最后输出时,第一要过滤值为0的数,第二要过滤第一个值不为0的数。(见21-28行代码)
如:0000 0123 2345 。 这个数的0000不能输出。且0123要变为123
5、26行的作用是:让形如:1234 567 2345 的数,变为:1234 0567 2345
代码:
#include<bits/stdc++.h>
using namespace std;
int main() {char a1[100], a2[100]; memset(a1,'0',sizeof(a1)); memset(a2,'0',sizeof(a2));int b1[25]; memset(b1, 0, sizeof(b1)); //int型长度是char型的四分之一cin >> a1 >> a2;reverse(a1,a1+strlen(a1)); reverse(a2,a2+strlen(a2)); //这里要反转两次reverse(a1,a1+100); reverse(a2,a2+100);a1[strlen(a1)] = '0'; a2[strlen(a2)] = '0'; //这里需要置0,否则是空。int places = 0, carry;for(int i = 99; i >= 0; i -= 4) {carry = 0;b1[places] += ((a1[i-3]-'0')*1000+(a1[i-2]-'0')*100+(a1[i-1]-'0')*10+(a1[i]-'0')+(a2[i-3]-'0')*1000+(a2[i-2]-'0')*100+(a2[i-1]-'0')*10+(a2[i]-'0'));carry = b1[places]/10000;b1[places]%=10000; places++; //下一位 if(carry > 0) b1[places]++; //进位 }bool flag1 = false, flag2 = false;for(int i = places; i >= 0; i--) {if(!flag1 && b1[i] == 0) continue; //忽略前导0 else {flag1 = !flag1; if(!flag2) { flag2 = !flag2; cout << b1[i]; } else cout << setw(4) << setfill('0') << b1[i]; //填充0}}return 0;
}
高效万进制——蓝桥杯|HDOJ 1002 大数加法——30行代码AC相关推荐
- 万进制——蓝桥杯|ACM 大数阶乘——21行代码AC
浅谈进制思想: 日常生活中我们习惯用十进制去运算: 为了方便电脑识别开发出了二进制,又因为2^3=8 , 2^4=16,因此应运而生了八进制与16进制. 世上本没有路,走的人多了,也便成了路,那么既然 ...
- 大数系列三——斐波那契数列——高效万进制,亿进制
浅谈万进制思想: 日常生活中我们习惯用十进制去运算: 为了方便电脑识别开发出了二进制,又因为2^3=8 , 2^4=16,因此应运而生了八进制与16进制. 世上本没有路,走的人多了,也便成了路,那么既 ...
- 解题报告——蓝桥 试题 基础练习 矩阵乘法——27行代码AC
储备知识: 矩阵: 矩阵的乘法: 也就是说,结果矩阵第m行与第n列交叉位置的那个值,等于第一个矩阵第m行与第二个矩阵第n列,对应位置的每个值的乘积之和. 矩阵的n次幂同理.不过是自己乘自己. 本题注意 ...
- 浅谈万进制算法与大数定理的结合(高精度乘除法,阶乘)
我们经常用的进制就是2进制.8进制.10进制和16进制.何来"万进制"?世上本无,有人喊了也就有了.呵呵 现在来谈谈自己对进制的一点不成熟的想法.计算机能"识别" ...
- UVA495 Fibonacci Freeze【大数+万进制】
The Fibonacci numbers (0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...) are defined by the recurrence: F0 = ...
- HDU1042 n!【大数+万进制】
N! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total Subm ...
- 【C语言数据结构与算法的应用4】巨大数----加减乘运算(万进制和Mec补码的应用)
巨大数 什么是巨大数 目的 巨大数的加法 巨大数的存储 万进制 微易码补码 巨大数的减法 巨大数的乘法 总结 什么是巨大数 巨大数其实就是有效数字位很大,可表示数的大小超过了int 的表示范围:[-2 ...
- 1000的阶乘-HDU 1042-大数阶乘(万进制思想)
思路: 即用数组a,数组中的每个元素存储4位数,, 比如,计算9的阶乘,在计算到7的阶乘时,7!为5040,可以用a[0]存储5040,没有产生进位,然后8!=5040*8=40320,如果看成万进制 ...
- 蓝桥杯 并查集汇总学习 及其代码
蓝桥杯 并查集汇总学习 及其代码 这里记录一下在刷蓝桥杯的并查集的题时写的一些代码 蓝桥幼儿园 蓝桥幼儿园 :https://www.lanqiao.cn/problems/1135/learning ...
最新文章
- 6个你必须知道的机器学习的革命性的教训
- SQL SERVER 存储过程学习笔记 (转)
- MySQL主从同步机制及同步中的问题处理
- 【数据分析】数据分析基础:SQL重要知识点梳理!
- java属性监听_Java event事件监听属性值变化 demo
- Mac平台上的一个MarkDown编辑器和静态博客生成工具-mweb mac最新版下载
- u-boot环境的擦除,默认设置,批写入
- 提示缺少msvcpNNN.dll怎么办
- Activiti Cloud 开始
- matlab使用xlsread报错,matlab的IO操作复习
- js判断页面第一次加载或者是否执行了刷新操作
- CSS —— 选择器
- 汇编语言 查看存储器中的数据
- pacman / yaourt 命令
- H-divergence
- 《iOS Drawing Practical UIKit Solutions》读书笔记(三) —— Drawing Images
- 计算机网络之五层体系结构
- 南京2级计算机成绩查询,南京审计大学教务管理系统登录入口、成绩查询网上选课查分...
- 6.进程通信 无名管道 有名管道
- JIT - 即时编译
热门文章
- Java 的这 100 个坑,我发誓不会再踩了
- 北京冬奥黑科技; 揭秘虎年春晚硬核科技;全球首款AR隐形眼镜问世;索尼3D显示技术路径曝光...
- Netflix:通过可视化和统计学改进用户QoE
- FFMPEG结构体分析
- TensorLayer MNIST
- android jni开发方式
- 解决scala_spark本地读取csv中文乱码问题
- Spark _29_SparkStreaming初始
- 基于Kafka+Flink+Redis的电商大屏实时计算案例
- 分布式文件系统之Tfs是什么?