七十七、Java算法练习打卡(三题)

132 阅读5分钟

文章目录

🔥题目一

题目描述

运行限制

题解

🔥题目二

题目描述

输入\出格式

 样例说明

评测用例规模与约定

运行限制

题解

🔥题目三

题目描述

输入\出描述

输入输出样例

 运行限制

题解


🔥题目一

题目描述

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

如果一个正整数只有 11 和它本身两个约数,则称为一个质数(又称素数)。

前几个质数是:2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, · · 。

如果一个质数的所有十进制数位都是质数,我们称它为纯质数。例如:2,3, 5, 7, 23, 37都是纯质数,而 11, 13, 17, 19, 29, 31不是纯质数。当然 1, 4, 35也不是纯质数。

请问,在 11 到 20210605中,有多少个纯质数?


运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

题解

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
        int count = 0;
        for ( int i = 1 ; i <= 20210605 ; i++ ){
            if ( isprinum(i) ){
                if ( fun(i) ){
                    count++;
                }
            }
        }
        System.out.println(count);
    }

    //判断质数
    public static boolean isprinum(int num){
        //注意0不是素数
        if ( num == 1 || num == 0 ){
            return false;
        }
        for ( int i = 2 ; i <= Math.sqrt(num) ; i++ ){
            if( num % i == 0){
                return false;
            }
        }
        return true;
    }

    //判断十进制位数是不是质数
    public static boolean fun(int peinum){
        while(peinum > 0){
            int n = peinum % 10;
            if ( !isprinum(n) ){
                return false;
            }
            peinum = peinum / 10;
        }
        return true;
    }
}

        注:Math.sqrt方法为求此数的正平方根

🔥题目二

题目描述

你有一架天平。现在你要设计一套砝码,使得利用这些砝码可以称出任意小于等于 N 的正整数重量。

那么这套砝码最少需要包含多少个砝码?

注意砝码可以放在天平两边。


输入\出格式

输入包含一个正整数 N。

输出一个整数代表答案。

 样例说明

3 个砝码重量是 1、4、6 可以称出 1至 7的所有重量。

1 = 1;

2 = 6 − 4(天平一边放 6,另一边放 4);

3 = 4 − 1;

4 = 4;

5 = 6 − 1;

6 = 6;

7 = 1 + 6;

少于 3 个砝码不可能称出 1 至 7 的所有重量。

评测用例规模与约定

对于所有评测用例,1 ≤ N ≤ 1000000000。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 512M

题解

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.close();
		int weight = 1;
		int count = 1;
		int total = 1;
		while (total < n) {
			count++;
			weight *= 3;
			total += weight;
		}
		System.out.println(count);
	}
}
砝码序号砝码重量总重量(可以称出的最大重量)
111
234
3913
42740
..................
count=count+1weight=weight*3total=total+weight
  • 当count=1时,砝码只有一个,重量为1,3^count-1=1
  • 当count=2时,砝码组合为1、3,是首项为1,公比为3的等比数列
  • 设count=k(k>=2)时,砝码组合是一个首项为1公比为3等比数列,末项为3^count-1,total=(3^count-1)/2

🔥题目三

题目描述

小蓝负责花园的灌溉工作。

花园可以看成一个 n 行 m 列的方格图形。中间有一部分位置上安装有出水管。

小蓝可以控制一个按钮同时打开所有的出水管,打开时,有出水管的位置可以被认为已经灌溉好。

每经过一分钟,水就会向四面扩展一个方格,被扩展到的方格可以被认为已经灌溉好。即如果前一分钟某一个方格被灌溉好,则下一分钟它上下左右的四个方格也被灌溉好。

给定花园水管的位置,请问 k 分钟后,有多少个方格被灌溉好?


输入\出描述

输入的第一行包含两个整数 n, m。

第二行包含一个整数 t,表示出水管的数量。

接下来 t 行描述出水管的位置,其中第 i 行包含两个数 r, c表示第 r 行第 c 列有一个排水管。

接下来一行包含一个整数 k。

其中,1<=n,m<=100,1<=t<=10,1<=k<=100

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

输入输出样例

 运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

题解

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();//列数
        int t=sc.nextInt();//出水口数
        int a,b;
        int [][]arr=new int[n+2][m+2];//经过时间后的湿地信息
        int [][]brr=new int[n+1][m+1];//当前时间湿地信息
        for (int i=0;i<t;i++){
            a=sc.nextInt();
            b=sc.nextInt();
            arr[a][b]=1;
            brr[a][b]=1;
        }
        int count=0;
        int k=sc.nextInt();//时间
        for (int i=1;i<=k;i++){//时间循环
            for (int j=1;j<=n;j++){//寻找当前湿地
                for (int s=1;s<=m;s++){//寻找当前湿地
                    if (brr[j][s]==1){//当前为湿地
                        arr[j-1][s]=1;//经过该时间后,此地为湿地
                        arr[j+1][s]=1;//经过该时间后,此地为湿地
                        arr[j][s-1]=1;//经过该时间后,此地为湿地
                        arr[j][s+1]=1;//经过该时间后,此地为湿地
                    }
                }
            }
            for (int j=1;j<=n;j++){//更改当前湿地信息(即经过该时间后为湿地)
                for (int s=1;s<=m;s++){
                    if (arr[j][s]==1){
                        brr[j][s]=1;
                        if (i==k){//到达最后的时间
                            count++;//统计数量
                        }
                    }
                }
            }
        }
        System.out.println(count);
    }
}

 出水管为湿地,湿地每分钟延伸,时间为k,总共延伸k次,外层循环为1-k,延伸后判断湿地位置,即为二层循环,判断完湿地,它的上下左右都会变为新的湿地,时间截止,计算所有湿地。