当前位置: 首页 > article >正文

蓝桥杯刷题——day9

蓝桥杯刷题——day9

  • 题目一
    • 题干
    • 解题思路一
    • 代码
    • 解题思路二
    • 代码
  • 题目二
    • 题干
    • 解题思路
    • 代码

题目一

题干

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

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

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

示例一:

输入:
2 3.14
输出:
13

题目链接: R格式

解题思路一

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

代码

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就会跟我们想要的不一样了,那么我们应该如何解决呢?

解题思路二

我们直接看代码:

代码

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:一个数组,用来存储小数部分的每一位数字。a[i]表示从小数点开始的第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,下面是完整代码:

代码

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);
    }
}

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


http://www.kler.cn/a/449540.html

相关文章:

  • C/C++基础错题归纳
  • 2.6 网络面试问题
  • docker安装nginx,docker部署vue前端,以及docker部署java的jar部署
  • 捋一捋相关性运算,以及DTD和NLP中的应用
  • Android Studio新建项目在源码中编译
  • Java Spring Boot 项目中嵌入前端静态资源:完整教程与实战案例
  • AI可信论坛亮点:合合信息分享视觉内容安全技术前沿
  • K8S中的PV、PVC介绍和使用
  • 探秘 DNS 服务器:揭开域名解析的神秘面纱
  • 【已解决】【大数据综合案例】上| Hive与MongoDB配置
  • 【CSS in Depth 2 精译_086】14.3:CSS 剪切路径(clip-path)的用法
  • 探索人工智能及机器学习如何赋能IP代理
  • HTML5 Web IndexedDB 数据库
  • 【chkdsk】chkdsk 按下停止键的后果
  • WPF+MVVM案例实战与特效(四十五)- 打造优雅交互:ListBox 的高级定制与行为触发(侧边菜单交互面板)
  • 直流电机驱动电路分享(HIP4082)
  • 《开启微服务之旅:Spring Boot Web开发举例》(二)
  • C++ 中的字面量类型定义
  • Redis数据对象
  • 谷歌发布首个 AI 推理模型欲挑战 OpenAI o1,AI 领域将展开新的竞争
  • 砂轮磨料基础知识及发展学习笔记
  • k8s-metrics-server
  • 鸿蒙项目云捐助第二十三讲云捐助项目云首页导航功能的实现
  • JavaScript 、ECMAScript、 ECMA-262、TC39??
  • 视频矩阵系统怎么做?深度解析矩阵全链路玩法
  • 解释下什么是面向对象?面向对象和面向过程的区别?