蓝桥杯刷题——day9

蓝桥杯刷题------day9

题目一

题干

小蓝最近在研究一种浮点数的表示方法:R格式。对于一个大于0的浮点数d,可以用R格式的整数来表示。给定一个转换参数n,将浮点数转换为R格式整数的做法是:

  1. 将浮点数乘以2n
  2. 四舍五入到最接近的整数。

输入: 一行一个整数n和一个浮点数d。
输出: 一行一个整数表示d用R格式表示出的值。

示例一:

输入:

2 3.14

输出:

13

题目链接: R格式

解题思路一

乍一看感觉这道题目不是很简单,不就是数的运算嘛,输入两个数n和d,然后输出2n×d的四舍五入结果。我们来看完整代码:

代码

java 复制代码
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        long num1 = scanner.nextInt();
        double num2 = scanner.nextDouble();
        double num = Math.pow(2,num1) * num2;
        long rounded = Math.round(num);
        System.out.println(rounded);
    }
}

很简单对不对,但是我们发现用这个去提交代码并不能完全通过,问题出在哪里呢?当 num1很大时,Math.pow(2, num1) 会导致浮点数溢出或精度丢失,可能无法准确表示结果。那么自然num就会跟我们想要的不一样了,那么我们应该如何解决呢?

解题思路二

我们直接看代码:

代码

java 复制代码
import java.util.Scanner;
public class Main {
    static int n, p, l;
    static int[] a = new int[114514];  // 数组大小适当设置
    static String q;

    // 乘法操作
    static void mul() {
        for (int i = 1; i <= l; i++) {
            a[i] *= 2;  // 按位乘以2
        }
        // 进位处理
        for (int i = 1; i <= l; i++) {
            a[i + 1] += a[i] / 10;  // 进位到下一位
            a[i] %= 10;  // 保留当前位的个位数
        }
        // 如果最高位有进位,需要增加长度
        if (a[l + 1] != 0) {
            l++;
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 输入整数n和小数q
        n = scanner.nextInt();
        q = scanner.next();
        
        // 反转小数q,方便后续处理
        StringBuilder sb = new StringBuilder(q);
        q = sb.reverse().toString();
        
        // 查找小数点位置
        p = q.indexOf('.');
        q = q.replace(".", "");  // 删除小数点
        
        // 设置小数的总长度
        l = q.length();
        
        // 将字符串转为整数数组
        for (int i = 0; i < l; i++) {
            a[i + 1] = q.charAt(i) - '0';  // 将字符转换为数字
        }
        
        // n次乘以2
        for (int i = 0; i < n; i++) {
            mul();
        }

        // 小数部分四舍五入
        if (a[p] >= 5) {
            a[p + 1]++;
        }
        
        // 进位检查
        for (int i = p + 1; i <= l; i++) {
            a[i + 1] += a[i] / 10;  // 进位到下一位
            a[i] %= 10;  // 保留当前位的个位数
        }
        
        // 再次检查最高位
        if (a[l + 1] != 0) {
            l++;
        }
        
        // 输出结果(逆序输出)
        for (int i = l; i > p; i--) {
            System.out.print(a[i]);
        }
    }
}

首先,我们进行变量的定义,n:表示要进行的乘法次数。p:表示小数点的位置。l:表示小数部分的长度。a:一个数组,用来存储小数部分的每一位数字。ai表示从小数点开始的第i位数字(数组从1开始存储)。然后定义一个函数mul(),这个函数用于将存储在数组a中的数字乘以2,并处理进位。主函数中中我们接受包括整数n(表示乘法次数)和字符串q(表示小数),为了方便处理,反转字符串q。通过q.indexOf('.')找到小数点的位置,并将小数点删除。通过for循环,调用mul()方法n次,即实现将小数部分乘以2的操作。每次调用mul()都会修改数组a中的数字。在完成n次操作后,判断小数点前面一个数子的大小(我们在删除小数点时记录了位置),如果大于5就进一,小于5就舍去小数点后面的数字,最后,程序输出乘法后的结果(反转后的结果),问题解决。

题目二

题干

今年是2021年,2021这个数字非常特殊, 它的千位和十位相等, 个位比百位大11,我们称满足这样条件的年份为特殊年份。输入5个年份,请计算这里面有多少个特殊年份。
输入: 输入5行,每行一个4位十进制数(数值范围为1000 至9999),表示一个年份。
输出: 输出一个整数,表示输入的5个年份中有多少个特殊年份。
示例一:

输入:

2019

2021

1920

2120

9899

输出:

2

题目地址: 特殊年份

解题思路

这条题目非常的简单,取出4位的每一位数字,然后判断十位和千位是否相同,并且个位是否比百位大一,如果同时满足,计数器就加1,下面是完整代码:

代码

java 复制代码
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] arr = new int[5];
        for (int i = 0; i < 5; i++) {
            arr[i] = scanner.nextInt();
        }
        int num = 0;
        for (int i = 0; i < 5; i++) {
            int one = arr[i] % 10;
            int two = (arr[i] / 10) % 10;
            int three = (arr[i] / 100) % 10;
            int four = (arr[i] / 1000) % 10;
            if (two == four && one-three ==1){
                num++;
            }
        }
        System.out.println(num);
    }
}

如果有任何的问题,欢迎评论和私信,也感谢各位的点赞和收藏!

相关推荐
江畔柳前堤4 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
Forever Nore5 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考7 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX8 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面8 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号8 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽9 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI9 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
地平线开发者10 小时前
征程6工具链模型X86推理方式说明
算法
地平线开发者10 小时前
【征程6】校准量化中HistogramObserver解析
算法