【蓝桥杯-筑基篇】基础数学思维与技巧(1)

news2025/1/16 1:34:23

🍓系列专栏:蓝桥杯

🍉个人主页:个人主页

目录

1.一百以内的A+B

 2.小学生算术求进位次数

3.最大公约数

4.最小公倍数

5.十进制转换其他进制

6.其他进制转十进制

7.天空数

8.求集合的所有子集

9.判断一个数是否为2的次方数

10.二进制中1的个数


1.一百以内的A+B

小明今年3岁了, 现在他已经能够认识100以内的非负整数, 并且能够进行100以内的非负整数的加法计算.
对于大于等于100的整数, 小明仅保留该数的最后两位进行计算, 如果计算结果大于等于100, 那么小明也仅保留计算结果的最后两位.

例如, 对于小明来说:2.小学生算术求进位次数
1) 1234和34是相等的
2) 35+80=15

a%100 让第一个数变成100以内的数字
b%100 让第二个数变成100以内的数字

因为两个100以内的数相加可能>100
因为小明只知道100以内的数字,故此还需让2数之和对100取余
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int a = scan.nextInt();
        int b = scan.nextInt();
        System.out.println((a%100+b%100)%100);

    }

 2.小学生算术求进位次数

题意:计算两个整数相加时需要多少次进位。程序可以一直计算两个整数相加,当输入2个0时,结束循环(输入的整数都不超过9个数字)
输入:123 456   输出:0

输入:555 555   输出:3

输入:123 594  输出:1

 分析:输入的数字不超过9个数字,可以用int表示。每次把a和b分别模10得到个位数。

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);


        while (true)
        {
            int a = scan.nextInt();


            int b = scan.nextInt();
            //输入2个0 退出循环
            if (a==0&&b==0){

                break;
            }

            int count=0;
            int c=0;
            while (a>0||b>0){
                c=a%10+b%10+c/10%10;
                if (c>=10){
                    count++;
                }
                a=a/10;
                b=b/10;
            }
            System.out.println(count);
        }

    }

3.最大公约数

公约数,亦称“公因数”。 它是一个能同时整除几个整数的数 。 如果一个整数同时是几个整数的 约数 ,称这个整数为它们的“公约数”。

公约数中最大的称为最大公约数。 对任意的若干个正整数,1总是它们的公因数。 公约数与公倍数相反,就是既是A的约数同时也是B的约数的数,12和15的公约数有1,3,最大公约数就是3。 再举个例子,30和40,它们的公约数有1,2,5,10,最大公约数是10

辗转相除法求最大公约数:

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        int b = scanner.nextInt();
        System.out.println(gcb(a, b));

    }

    private static int gcb(int a, int b) {

        int temp=0;
        while (b>0){
            temp=a%b;
            a=b;
            b=temp;

        }
        return a;
    }


}


4.最小公倍数

以知a和b两个数,最小公倍数 = (a*b)/ 最大公约数

如:4和6的最大公约数是2,那最小公倍数就是(4*6) /  2 = 12。

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        int b = scanner.nextInt();
        System.out.println((a*b)/gcb(a, b));

    }

    private static int gcb(int a, int b) {

        int temp=0;
        while (b>0){
            temp=a%b;
            a=b;
            b=temp;

        }
        return a;
    }


}

5.十进制转换其他进制

1.使用Integer.toxxxString()方法

        // 10进制转2,8,16进制,返回类型String
        String tb = Integer.toBinaryString(9);    // 10进制转2进制
        String to = Integer.toOctalString(10);    // 10进制转8进制
        String th = Integer.toHexString(1194684);    // 10进制转16进制

2.使用Integer.toString() 方法

    public static void main(String[] args) {
        // 10进制转2,8,16进制,返回类型String
        // 使用Integer.toString()方法;
        String tb = Integer.toString(9, 2); // 10进制转2进制
        System.out.println(tb);
        String to = Integer.toString(10, 8);    // 10进制转8进制
        System.out.println(to);
        String th = Integer.toString(1194684, 16);// 10进制转16进制
        System.out.println(th);

    }

6.其他进制转十进制

1.使用Integer.parseInt()方法

// 2,8,16进制转换成10进制
// 使用Integer.parseInt()方法;转换成负数只需要在字符串前面加上负号-;大于Integer.MAX_VALUE或小于Integer.MIN_VALUE的转换将会抛出错误。
int b = Integer.parseInt("1001", 2);    // 2进制转10进制
int o = Integer.parseInt("12", 8);    // 8进制转10进制
int h = Integer.parseInt("123ABC", 16);    // 16进制转10进制

2.使用Integer.valueOf()方法

/ 2,8,16进制转换成10进制
// 使用Integer.valueOf()方法;转换成负数只需要在字符串前加上负号-;大于Integer.MAX_VALUE或小于Integer.MIN_VALUE的转换将会抛出错误。
Integer b = Integer.valueOf("1001", 2); // 2进制转10进制
Integer o = Integer.valueOf("12", 8);    // 8进制转10进制
Integer h = Integer.valueOf("123ABC", 16);    // 16进制转10进制

7.天空数

四位数2992,这个数,它的十进制数,其四位数字之和为2+9+9+2=22,它的十六进制数BB0,其四位数字之和也为22,同时它的十二进制数表示1894,其四位数字之和也为22,把这样的一个四位数命名为天空数,任给一个四位数判断它是否为天空数

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int number = scanner.nextInt();
        if (getSum(number,10)==getSum(number,16)&&getSum(number,10)==getSum(number,12)){
            System.out.println("true");
        }else System.out.println("false");
    }

    private static int getSum(int number, int i) {
        int sum=0;
        while (number>0){
            sum=sum+number%i;
            number=number/i;
        }
        return sum;
    }


}

8.求集合的所有子集

如果一个集合的元素个数为n,则每个元素都有存在或不存在两种情况,n个元素一共2^n种情况,因此元素个数为n的集合一共有2的n次方个子集。

利用二进制的思想:

0表示该数组位置不选,1表示选中。加入数组为[1,2,3,4] 0110就表示[2,3] 1001表示[1,4]

 

    public static void main(String[] args) {
        int arr[]={1,2,3,4};
        int number = (int)Math.pow(2, arr.length)-1;
        for (int i = 0; i <= number; i++) {
            int index=arr.length-1;
            int n=i;
            System.out.print("{");
            while (n>0){

                if (n%2==1){
                    System.out.print(arr[index]);
                }
                index--;
                n=n/2;

            }
            System.out.println("}");

        }


    }

 

9.判断一个数是否为2的次方数

如果采用循环去遍历2的次方数,来判断时,当这个数特别大,时间复杂度为O(n);

所以采用别的方法,2的次方数其二进制表示最高位肯定为1,其余为0。
例如:8 二进制位 1000,64 二进制位 1000000。将这个二进制-1,然后和其原来的数&运算,如果是2的次方数,其结果应该为0,否则不是2的次方数。

    public static void main(String[] args) {
        int number=0;
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
            number=scanner.nextInt();
            if ((number&(number-1))==0){
                System.out.println("yes");

            }else System.out.println("no");


        }




    }


10.二进制中1的个数

方法一 : 调用API

先将整数转为二进制.然后统计1的个数.

    public static void main(String[] args) {
        int number=0;
        
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
            int count=0;
            number=scanner.nextInt();
            String s = Integer.toBinaryString(number);
            char[] array = s.toCharArray();
            for (int i = 0; i < array.length; i++) {
                if (array[i]=='1'){
                    count++;
                }
            }

            System.out.println(count);
        }




    }

方法二 : 对2取余

假如 10 这个数,它的二进制数是 00000000000000000000000000001010

10 % 2 = 0 —— 相当于把 10 的二进制的最低位也就是最右边的 0 拿到了

10 / 2 = 5 —— 5 的二进制是 00000000000000000000000000000101 相当于去掉了 10 的二进制最低位也就是最右边 0 

5 % 2 = 1 —— 相当于把 5 的二进制的最低位也就是最右边的 1 拿到了

5 / 2 = 2 —— 2 的二进制是 00000000000000000000000000000010 相当于去掉了 5 的二进制最低位也就是最右边 1

2 % 2 = 0 ——  相当于把 2 的二进制的最低位也就是最右边的 0 拿到了

2 / 2 = 1 —— 1 的二进制是 00000000000000000000000000000001 相当于去掉了 2 的二进制最低位也就是最右边 0

后面依次类推,当每次 n%2 = 1 就累计一次,知道  n = 0 为止,下面是代码:

    public static void main(String[] args) {
        int number=0;


        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
            int count=0;
            number=scanner.nextInt();
            while (number >0) {
                if (number%2==1){
                    count++;
                }
                number=number/2;

            }

            System.out.println(count);
        }


    }

方法三 :位运算

有个表达式是 ====>  n = n & ( n-1 ) ,假如输入 n = 13 ,13 的二进制 1101

1101 —— n

1100 —— n-1

1100 —— n & n-1 再赋给 n、

1011 —— n-1

1000 —— n & n-1 再赋给 n

0111 —— n-1

0000 —— n & n-1 再赋给 n

每次去掉一个 1,执行几次就有几个 1 ,每次把二进制数的最右边的 1去掉,直到为零停止,代码如下:

    public static void main(String[] args) {
        int number = 0;

        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int count = 0;
            number = scanner.nextInt();
            while (number!=0) {
                number = (number & (number - 1));
                count++;
            }
            System.out.println(count);

        }
    }


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/178552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ISIS简介、NSAP与NET地址、Router-Id转换成NET地址

2.0.0 ISIS简介、NSAP与NET地址、Router-Id转换成NET地址 ISIS简介 IS-IS&#xff08;Intermediate System-to-Intermediate System&#xff09;中间系统到中间系统。 1、该协议最初是ISO国际标准化组织为CLNP&#xff08;Connection Less Network Protocol&#xff0c;无连接…

HashMap 正解

HashMap 实现原理 以及扩容机制 HashMap 的 put 以及扩容基本实现 数据结构 上述截图是 HashMap 的内部存储的数据结构。大体上是通过 hash 值来获取到对应的下标。如果当前下标为 null 的话&#xff0c;直接创建并设置一个新的节点&#xff0c;反之就是添加到该链表的最后 pu…

好客租房-09_学习MongoDB并完善通讯系统

9. 学习MongoDB 并完善租房的通讯系统后端本章目的为MongoDB快速入门, 并完善上一节编写的通讯系统后台, 将DAO层从HashMap迁移到MongoDB中.思考如下问题:MongoDB属于关系型还是非关系型数据库为什么在我们的通讯系统中选择MongoDB作为数据库?9.1 mongoDB概念简介MongoDB是一个…

python+django医院固定资产设备管理系统

管理员功能模块 管理员登录&#xff0c;通过填写用户名、密码、角色等信息&#xff0c;输入完成后选择登录即可进入医院设备管理系统&#xff0c; 管理员登录进入医院设备管理系统可以查看首页、个人中心、科室员管理、维修员管理、设备领用管理、设备信息管理、设备入库管理、…

人工智能入门杂记

本篇文章属于所有发表的文章的导读吧&#xff0c;以后会常更新。 目录 1.数据挖掘、机器学习、深度学习、云计算、人工智能 2.深度学习、强化学习、对抗学习、迁移学习 3.基础知识--线性代数 4.基础知识--概率与数理统计 5.常用工具库 6.机器学习 6.1 什么是训练什么是推…

Java数组

文章目录Java 数组一、数组介绍二、数组1. 数组静态初始化1.1 数组定义格式1.2 数组静态初始化2. 数组元素访问3. 数组遍历操作3.1 数组遍历介绍3.2 数组遍历场景3.3 数组遍历案例1&#xff09;数组遍历-求偶数和2&#xff09;数组遍历-求最大值3&#xff09;数组遍历综合案例4…

【C语言航路】第十四站:文件

目录 一、为什么使用文件 二、什么是文件 1.程序文件 2.数据文件 3.文件名 三、文件的打开和关闭 1.文件指针 2.文件的打开和关闭 四、文件的顺序读写 1.对于输入输出的理解 2.fgetc与fputc &#xff08;1&#xff09;fgetc与fputc的介绍 &#xff08;2&#xff0…

2023年springcloud面试题(第一部分)

1. 什么是微服务架构微服务架构就是将单体的应用程序分成多个应用程序&#xff0c;这多个应用程序就成为微服务&#xff0c;每个微服务运行在自己的进程中&#xff0c;并使用轻量级的机制通信。这些服务围绕业务能力来划分&#xff0c;并通过自动化部署机制来独立部署。这些服务…

MP-4可燃气体传感器介绍

MP-4可燃气体传感器简介MP-4可燃气体传感器采用多层厚膜制造工艺&#xff0c;在微型Al2O3陶瓷基片的两面分别制作加热器和金属氧化物半导体气敏层&#xff0c;封装在金属壳体内。当环境空气中有被检测气体存在时传感器电导率发生变化。该气体的浓度越高&#xff0c;传感器的电导…

JavaWeb | JDBC相关API详解 2 (内附以集合形式输出表)

本专栏主要是记录学习完JavaSE后学习JavaWeb部分的一些知识点总结以及遇到的一些问题等&#xff0c;如果刚开始学习Java的小伙伴可以点击下方连接查看专栏 本专栏地址&#xff1a;&#x1f525;JDBC Java入门篇&#xff1a; &#x1f525;Java基础学习篇 Java进阶学习篇&#x…

C语言编程题

1、求斐波那契数列1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8……前20项之和 #include<stdio.h> int main() {int i,j,k,t2;ij1;printf("%d %d\n",i,j);for(k0;k<9;k){iij;jij;ttij;printf("%d %d\n",i,j);}printf(&q…

java七大查找 十大排序 贪心

七大查找 1.1二分查找(前提是 数据有序)说明&#xff1a;元素必须是有序的&#xff0c;从小到大&#xff0c;或者从大到小都是可以的。public static int binarySearc(int[] arr,int number){int min0;int maxarr.length-1;while(true){if(min>max){return -1;}int mid(maxm…

c++二插搜索树

1二插搜索树的概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: ​ 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值 ​ 若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值 …

mongodb shell

连接指定数据库 .\mongosh.exe localhost:27017/test不连接数据库 .\mongosh.exe --nodb然后连接数据库 conn new Mongo("localhost:27017") /// mongodb://localhost:27017/?directConnectiontrue&serverSelectionTimeoutMS2000 db conn.getDB("test&q…

Git学习笔记(黑马)

目录 一、获取本地仓库 二、为常用指令配置别名 三、基础操作指令 四、分支 五、Git远程仓库&#xff08; 码云Gitee&#xff09; &#xff08;一&#xff09;配置SSH公钥 &#xff08;二&#xff09;Gitee设置账户公钥 六、操作远程仓库 &#xff08;一&#xff09;添…

【数据结构】详谈复杂度

目录 1.前言 2.什么是复杂度 3.如何计算时间复杂度 1.引例 2.二分查找 3.常见的复杂度 4.如何计算空间复杂度 5.关于递归 6.总结 1.前言 我们在做一些算法题时&#xff0c;经常会发现题目会对时间复杂度或者空间复杂度有所要求&#xff0c;如果你不知道什么是复杂度时&am…

SQL--DDL

目录 一、数据库的相关概念 二、MySQL数据库 1. 关系型数据库&#xff08;RDBMS&#xff09; 2. 数据数据库 3. MySQL客户端连接的两种方式 方式一&#xff1a;使用MySQL提供的客户端命令行工具 方式二&#xff1a;使用系统自带的命令行工具执行指令 三、SQL SQL的…

【C++】深浅拷贝

最近一些老铁一直问我深浅拷贝的问题&#xff0c;今天我们就来介绍一下深浅拷贝在说深浅拷贝构造之前&#xff0c;我们先介绍一下拷贝构造函数的应用场景&#xff1a;使用另一个同类型的对象来初始化新创建的对象。浅拷贝我们在学类和对象时了解到了类的6大默认函数&#xff0c…

给定一个数组arr,代表每个人的能力值。再给定一个非负数k,如果两个人能力差值正好为k,那么可以凑在一起比赛 一局比赛只有两个人,返回最多可以同时有多少场比赛

目录题目描述题目解析代码实现对数器题目描述 给定一个数组arr&#xff0c;代表每个人的能力值。再给定一个非负数k&#xff0c;如果两个人能力差值正好为k&#xff0c;那么可以凑在一起比赛一局比赛只有两个人&#xff0c;返回最多可以同时有多少场比赛 比如&#xff1a; [3&a…

MyBatis的入门

1、Mybatis的简介和特性 2、环境配置及其注意事项 2.1、注意事项 本文示例&#xff0c;开发环境 IDE&#xff1a;idea 2019.2 构建工具&#xff1a;maven 3.8.6 MySQL版本&#xff1a;MySQL 8 MyBatis版本&#xff1a;MyBatis 3.5.7 MySQL不同版本的注意事项&#xff1a;…