蓝桥杯|大数问题的处理
本文最后更新于:a minute ago
本文记录在 蓝桥杯 刷题中发现的一个同类型问题,大数的处理。以下是「BASIC-10 十进制转十六进制」和「BASIC-30 阶乘计算」的解题分享。
如果觉得我代码太烂,欢迎留言拍砖。🎉
BASIC-10 十进制转十六进制
1 |
|
一、思路
- 用自带的进制输出,真是太方便啦!📎 C++好用的进制转换
- 但是这数据规模忒🐔大了,
每个十六进制数长度不超过 100000
*4/3
=长度足足有 133333 位
。
1 |
|
二、改进
1.用什么存
- 用字符串读入,输出。(便于挨个字符转换 + 便于字符拼接)
2.如何转换
- 十六进制数 挨个转换为 二进制数,并拼接。【利用数组
s2 += a[s16[j] - 'A' + 10];
】 - 二进制数,每三位,转换成八进制。【利用键值对
s8 += m[tmp];
】
1 |
|
BASIC-30 阶乘计算
1 |
|
一、思路:
1.用什么存:
- 用数组
ans
来存结果,因为不知道数组多长,使用vector
,并倒序储存结果,个位在 a[0]。 - 用数组
flag
来存进位值,同样使用vector
。
2.如何进位
flag
长度保持比ans
长度多一位,当flag
长度 =ans
长度时,flag
长度增加,存ans
的进位值 或 0。一轮结束,当
falg
最后一位,不为零时,ans
长度增加,存falg
最后一位值。
3.缺点
- vector 长度增加时 的判断过于麻烦。(判断是否处于最后一位 & 判断增加长度处的值为进位值 or 0)
- 边乘边进位的逻辑过于繁琐,可以分两次,先乘再加,(见优化)
1 |
|
二、优化
初始化一个大数组
a[10000]
,可省去push_back()
步骤。多次循环,将 乘法 和 进位(加法) 用两个循环分开处理。
多次循环,将 去除前置0 和 打印 分开处理。
1 |
|
三、启示
- 有大大大大数乘法,可以用数组存。
蓝桥杯|大数问题的处理
https://www.aimtao.net/lanqiao/