【2024蓝桥杯/C++/B组/R 格式】

代码来源:2024第十五届蓝桥杯 C/C++B组真题题解_蓝桥杯2024b组c语言答案-CSDN博客

代码

cpp 复制代码
// 模拟高精度,要求f乘以2的n次方,即模拟n次f=f*2
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=1e6+5; // 定义常量maxn为1e6+5
const int inf=0x3f3f3f3f; // 定义常量inf为0x3f3f3f3f
int n,f[maxn],fd,lenf; // 定义变量n和长度为maxn的数组f以及fd和lenf
char s[maxn]; // 定义长度为maxn的字符数组s

// 函数add实现将高精度数字f与自身相加
void add()
{
    int flag=0; // 初始化进位标志为0
    for(int i=0;i<lenf;i++) // 遍历数组f中的每一位
    {
        f[i]=f[i]+f[i]+flag; // 计算当前位的值加上自身和进位
        flag=(f[i]>=10); // 如果当前位大于等于10,则需要进位
        f[i]%=10; // 取模10得到个位数
    }
    if(flag) f[lenf++]=flag; // 如果有进位,则在最高位添加进位值,并更新长度
}

int main()
{
    scanf("%d %s",&n,s); // 输入整数n和字符串s
    int len=strlen(s); // 获取字符串s的长度
    for(int i=len-1;i>=0;i--) // 从字符串s的最后一位开始遍历
        if(s[i]!='.') // 如果当前字符不是小数点
            f[lenf++]=s[i]-'0'; // 将字符转换为数字并存入数组f中
        else
            fd=len-1-i; // 如果遇到小数点,则记录下标位置
    while(n--)
        add(); // 执行n次add操作,即将f乘以2
    if(f[fd-1]>=5) // 判断是否有四舍五入的需求
    {
        int flag=1; // 初始化进位标志为1
        for(int i=fd;i<lenf;i++) // 遍历小数部分到末尾
        {
            f[i]=f[i]+flag; // 当前位加上进位
            flag=(f[i]>=10); // 如果当前位大于等于10,则需要进位
            f[i]%=10; // 取模10得到个位数
        }
        if(flag) f[lenf++]=flag; // 如果有进位,则在最高位添加进位值,并更新长度
    }
    for(int i=lenf-1;i>=fd;i--) // 从最高位开始输出,直到小数点前一位
        printf("%d",f[i]); // 输出数组f中的数字
    printf("\n"); // 输出换行符
    return 0; // 返回0结束程序
}

积累

假设低位进位为flag,计算进位后的浮点数

cpp 复制代码
    int flag=0; // 初始化进位标志为0
    for(int i=0;i<lenf;i++) // 遍历数组f中的每一位
    {
        f[i]=f[i]+flag; // 计算当前位的值加上进位
        flag=(f[i]>=10); // 如果当前位大于等于10,则需要进位
        f[i]%=10; // 取模10得到个位数
    }
    if(flag) f[lenf++]=flag; // 如果有进位,则在最高位添加进位值,并更新长度

四舍五入的计算

cpp 复制代码
    if(f[fd-1]>=5) // 判断是否有四舍五入的需求
    {
        int flag=1; // 初始化进位标志为1
        for(int i=fd;i<lenf;i++) // 遍历小数部分到末尾
        {
            f[i]=f[i]+flag; // 当前位加上进位
            flag=(f[i]>=10); // 如果当前位大于等于10,则需要进位
            f[i]%=10; // 取模10得到个位数
        }
        if(flag) f[lenf++]=flag; // 如果有进位,则在最高位添加进位值,并更新长度
    }

注意

开始字符串输入是高位在先,低位在后。

考虑到最高位进位需要只能向后拓展空间,于是处理后低位在先,高位在后。

字符串输入中,小数点所处的下标如果是i,就应该变为len-1-i (假设处在最高位,i=0,此时处理后应该对应len-1)。但这里要注意,f数组只考虑数字的存储,fd对应的实际上是小数点相邻的一个整数位,不是小数点。

相关推荐
独正己身6 分钟前
代码随想录day3
数据结构·c++·算法
Hunter_pcx7 分钟前
[C++技能提升]类注册
c++·人工智能
IU宝43 分钟前
vector的使用,以及部分功能的模拟实现(C++)
开发语言·c++
Hunter_pcx1 小时前
[C++技能提升]插件模式
开发语言·c++
左手の明天2 小时前
【C/C++】C++中使用vector存储并遍历数据
c语言·开发语言·c++
PaLu-LI2 小时前
ORB-SLAM2源码学习:Initializer.cc(13): Initializer::ReconstructF用F矩阵恢复R,t及三维点
c++·人工智能·学习·线性代数·ubuntu·计算机视觉·矩阵
呆呆珝2 小时前
RKNN_C++版本-YOLOV5
c++·人工智能·嵌入式硬件·yolo
c++初学者ABC3 小时前
蓝桥杯LQ1044 求完数
c++·算法·lq蓝桥杯
_GR4 小时前
2013年蓝桥杯第四届C&C++大学B组真题及代码
c语言·数据结构·c++·算法·蓝桥杯
CodeClimb4 小时前
【华为OD-E卷 - VLAN资源池 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od