第十四届蓝桥杯 三十天刷题 第二天

📢📢📢大家好啊,我是浅夜,来交今天的作业啦~


  1. 📌奇数倍数📌

📄题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

请你找到最小的整数 X 同时满足:

  1. X 是 2019的整倍数;

  1. X 的每一位数字都是奇数。

📌要找的整数一定是2019的整数倍 那我们只需要遍历是2019的整数倍的数就可以啦

📌再写一个判断这个数的数位都是不是奇数就行啦

📗参考代码

public class Main {
    public static void main(String[] args) {
        for (int i = 2019; ; i += 2019) {
            if (check(i)) {
                System.out.println(i);
                break;
            }
        }
    }

     static boolean check(int i) {
        while (i > 0) {
            if (i%2 == 0) return false;
            i /= 10;
        }
        return true;
    }
}

  1. 📍求值📍

📄题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

学习了约数后,小明对于约数很好奇,他发现,给定一个正整数 t,总是可以找到含有个约数的整数。小明对于含有 t 个约数的最小数非常感兴趣,并把它定义为 St

例如 1=1,2=2,3=4,4=6,⋅⋅⋅S1=1,S2=2,S3=4,S4=6,⋅⋅⋅ 。

现在小明想知道,当 t=100 时,St 是多少?即 S100 是多少?

❓思路分享

📍题目就是在考🐔(质因)子 遍历找🐔为50的数即可

📍因为线性筛只找到一半的因数 所以这里是50

📗参考代码

public class Main {

    public static void main(String[] args) {
        for (int i = 2; ; i++) {
            int ans = 0;
            for (int j = 1; j < i / j; j++) {//根据唯一分解定理 只需要遍历到根号i
                if (i % j == 0) ans++;
            }
            if (ans == 50) {
                System.out.println(i);
                return;
            }
        }
    }
}


  1. 🔖求和🔖

📄问题描述

给定 n 个整数 1,2,⋅⋅⋅,a1,a2,⋅⋅⋅,an ,求它们两两相乘再相加的和,即:

S=a1a2+a1a3+⋯+a1an+a2a3+⋯+an−2an−1+an−2an+an−1an

🔑输入格式

输入的第一行包含一个整数 n

第二行包含 n 个整数 1,2,⋯,a1,a2,⋯,an

🔒输出格式

输出一个整数 S,表示所求的和。请使用合适的数据类型进行运算。

❓思路分享

求两两相乘再相加的和 公式:S=a1a2+a1a3+⋯+a1an+a2a3+⋯+an−2an−1+an−2an+an−1an 我们对这串式子提公因式得到:S = a1(a2 + ... + an) + a2(a3 + ... + an) + ... + an-2(an-1 + an) + an-1 *an

这n个数两两相乘 那么对于ai 来讲,是不是要求它与前i-1个数的乘积再求和 这样我们只需要遍历ai ,求ai 乘以前i-1项的和然后累加即可!

📄参考代码

public class Main {
    static int N = 200010;
    static long[] a = new long[N];

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        for (int i = 1; i <= n; i++) {
            a[i] = sc.nextInt();
        }
        long ans = 0;//保存结果
        long sum = 0;//保存前i-1项的和
        for (int i = 1; i <= n; i++) {
            ans += a[i] * sum;
            sum += a[i];
        }
        System.out.println(ans);
    }
}

  1. 🎒数位排序🎒

📄问题描述

小蓝对一个数的数位之和很感兴趣, 今天他要按照数位之和给数排序。当 两个数各个数位之和不同时, 将数位和较小的排在前面, 当数位之和相等时, 将数值小的排在前面。

例如, 2022 排在 409 前面, 因为 2022 的数位之和是 6, 小于 409 的数位 之和 13 。

又如, 6 排在 2022 前面, 因为它们的数位之和相同, 而 6 小于 2022 。

给定正整数 n,m, 请问对 1 到 n 采用这种方法排序时, 排在第 m 个的元 素是多少?

🔑输入格式

输入第一行包含一个正整数 n

第二行包含一个正整数 m

🔒输出格式

输出一行包含一个整数, 表示答案。

❓思路分享

🎒定义一个方法用来求数位和

🎒自定义排序按照规则(两个数各个数位之和不同时, 将数位和较小的排在前面, 当数位之和相等时, 将数值小的排在前面)来排序

有一说一这个自定义排序还是不熟练,看着梗佬(执梗)的代码才勉强改出来哈哈哈

📗参考代码

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        //自定义排序需要用 Integer[]
        Integer[] a = new Integer[n];
        for (int i = 0; i < n; i++) a[i] = i + 1;
        //自定义排序
        Arrays.sort(a, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                int a = check(o1);
                int b = check(o2);
                if (a != b) return a - b;
                else return o1 - o2;
            }
        });
        System.out.println(a[m - 1]);
    }

    //求数位和
    private static int check(Integer x) {
        int res = 0;
        while (x != 0) {
            res += x % 10;
            x /= 10;
        }
        return res;
    }
}

📢📢📢好啦 今天的打卡分享就是这些了 我们明天再见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值