蓝桥杯JAVAB

一,立方变自身-JavaB(6届)

public class L3 {
    public static void main(String[] args) {
        int cnt = 0;//记录满足要求的个数
        //立方再往上,各位相加不会等于原数
        for (int i = 1; i < 100; i++) {
            //得到三次方
            int ans = (int) Math.pow(i, 3);
            //得到立方的每位数相加
            int number = get(ans);
            //判断是否满足条件
            //满足个数++
            if (number == i) cnt++;
        }
        System.out.println(cnt);
    }

    public static int get(int num) {
        int number = 0;//保存立方每位数相加的结果
        while (num > 0) { //大于0就继续
            number += num % 10;//得到最后一位
            num /= 10;
        }
        return number;
    }
}

答案:6

二,数的分解-JavaB(10届)

public class L3 {
    public static void main(String[] args){
      int count=0;
      for(int i=1;i<=2019;i++){
          for(int j=1;j<=2019;j++){
              for(int k=1;k<=2019;k++){
                  if(i+j+k==2019&&judge(i)&&judge(j)&&judge(k)&&i!=j&&j!=k&&i!=k){
                      count++;
                  }
              }
          }
      }
System.out.println(count);

    }
    public static boolean judge(int n){
        while(n>0){
            if(n%10==2||n%10==4){
                return false;
            }
            n/=10;
        }
        return true;
    }
}

三,数列求值-JavaB(10届)

数列题目首先想到用数组表示

public class L3 {
    public static void main(String[] args){
        int a[]=new int[20190324];
        a[0]=a[1]=a[2]=1;
        for(int i=3;i<20190324;i++){
            a[i]=(a[i-1]+a[i-2]+a[i-3])%10000;
        }
        //数组是从零开始的,第20190324位数组下标就是20190323
        System.out.println(a[20190323]);

    }
}

四,单词分析-JavaB(11届)

使用数组下标记录位置

import java.util.Scanner;
import java.util.Arrays;
//输出出现次数最多的字母,以及它出现的次数
public class A1 {
    public static void main(String []args){
Scanner sc=new Scanner(System.in);
//字母输入
        char[] ch=sc.nextLine().toCharArray();
        //建立从a到z的数组
        int[] num=new int[30];
        for(int i=0;i<ch.length;i++){
            //当每有一个a到z的字母时,下标就加一,记录字母出现次数
            num[ch[i]-'a']++;
        }
        int max=-1;
        int maxi=-1;
        for(int i=0;i<num.length;i++){
            if(max<num[i]){
                //max记录最多字母出现的次数
                max=num[i];
                //maxi记录出现次数最多字母位置
                maxi=i;
            }
        }
        char result=(char)('a'+maxi);
        System.out.println(result);
        System.out.println(max);
    }
}

五,成绩分析-JavaB(11届)

求某个班的最高分,最低分,平均分

import java.util.Scanner;
import java.util.Arrays;
//计算最大值,最小值,平均分数
public class A1 {
    public static void main(String []args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
double sum=0;
int []a=new int[n];
for(int i=0;i<n;i++){
    a[i]=sc.nextInt();
    sum=sum+a[i];
}
//默认升序排列
Arrays.sort(a);
System.out.println(a[n-1]);
System.out.println(a[0]);
//String.format表示某些部分是可变的,详细看文章
System.out.println(String.format("%.2f",sum/n));


    }
}

String.format()的详细用法-CSDN博客

六,蛇形填数-JavaB(11届)

思路:找他们之间的规律,按照a[i][j]中找的i与j相等,寻找之间差值的规律。

a[1][1]=1,a[2][2]=5,a[3][3]=13,a[4][4]=25……

5-1=4,13-5=8,25-13=12……

import java.util.Scanner;
public class A1 {
    public static void main(String []args){
int sum=1;
int add=0;
for(int i=1;i<=20;i++){
    sum=sum+add;
    add=add+4;
    if(i==20){
        System.out.println(sum);
        break;
    }
}
    }
}

在加前一位数的同时sum也在相加,放在同一个for循环里面 

七,寻找2020-JavaB(11届)

import java.util.Scanner;
public class A1 {
    static char[][]r=new char[300][300];//首先定义一个300行300列的数组
    public static void main(String []args){
Scanner scanner=new Scanner(System.in);
for(int i=0;i<r.length;i++){
    r[i]=scanner.nextLine().toCharArray();//存取数组中的数据
}
int count=0;//定义一个结果集
        //找2020位于同一行的
        for(int i=0;i<300;i++){
            for(int j=0;j<300-3;j++){//300-3是因为要确定其中一个,这里面的一个确定其中的三个
                if(r[i][j]=='2'&&r[i][j+1]=='0'&&r[i][j+2]=='2'&&r[i][j+3]=='0'){
                    count++;
                }


            }
        }
        //找2020位于同一列的
        for(int i=0;i+3<300;i++){
            for(int j=0;j<300;j++){
                if(r[i][j]=='2'&&r[i+1][j]=='0'&&r[i+2][j]=='2'&&r[i+3][j]=='0'){
                    count++;
                }
            }
        }
        //同一斜线
        for(int i=0;i<300-3;i++){
            for(int j=0;j<300-3;j++){
                if(r[i][j]=='2'&&r[i+1][j+1]=='0'&&r[i+2][j+2]=='2'&&r[i+3][j+3]=='0'){
                    count++;
                }
            }
        }
        System.out.println(count);
    }
}

运行结果:

八,门牌制作-JavaB(11届) 

import java.util.Scanner;
public class A1 {
    public static void main(String []args){
        int count=0;
        //拆分数字,计算里面含有某个数字的个数
        for(int i=1;i<=2020;i++){
            int x=i;//防止死循环
            while(x>0){
                if(x%10==2){
                    count++;
                }
                x=x/10;
            }
        }
        System.out.println(count);
    }
}

运行结果:624

九,时间显示-JavaB(12届) 

public class A0 {
    public static void main(String []args){
        Scanner sc=new Scanner(System.in);
        Long n=sc.nextLong();
        n=n%(24*60*60*1000);
        n/=1000;
        int h=(int)(n/3600);
        int m=(int)((n%3600)/60);
        int s=(int)((n%3600)%60);
        //注意,这里必须用printf才能输出
        System.out.printf("%02d:%02d:%02d\n",h,m,s);

      }

    }

十,ASC-javaB(12届) 

public class L1{
    public static void main(String[] args){
   int i='L'-'A'+65;
   System.out.println(i);
       }
    }

十一,字符统计-JavaB(13届)

 

import java.util.Scanner;

public class L1 {
public static void main(String []args){
Scanner scan=new Scanner(System.in);
String S=scan.next();
int len=S.length();
int[] array=new int[26];
int i,max=0;
for(i=0;i<len;i++){
    array[S.charAt(i)-'A']++;//统计字符串中字符出现的总次数
    max=Math.max(max,array[S.charAt(i)]-'A');//统计字符串中字符出现的最大值
}
for(i=0;i<26;i++){
    if(max==array[i])
        System.out.println("%c"+(char)(i+'A'));//输出最大值
}
}

    }

 十二,山-javaB(13届)

思路:首先设计一个算法,判断是否为山,满足山的两个条件,一是从第一个数到第1/2位是否为单调递增。其次从2022到2022222022进行循环

public class L1 {
public static void main(String []args){
int count=0;
for(int m=2022;m<=2022222022;++m){
    if(isshan(1)){
        count++;
    }
}
System.out.println(count);
}
//1,先编写一个方法判断一个数是不是shan
    //1.1先输入一个字符串形式的将其转化为数组
    //1.2依次遍历,从数的第一个数字到第二分之一个数字判断是否为单调递增,是否左右对称
public static boolean isshan(long a){
    //valueOf是将对象s改成String类型的对象
    String s=String.valueOf(a);
    //CharArray是将字符串中的字符转化为字符数组
    char []chars=s.toCharArray();
    for(int i=0;i<s.length()/2;i++){
        //是否满足单调递增和对称的条件,注意是否对称该如何表示
        if(chars[i]<chars[i+1]||chars[i]!=chars[chars.length-i-1]);
        return false;
    }
    return true;
}
    }

 十三,星期计算-JavaB(13届)

import java.math.BigInteger;
public class L1 {
    public static void main(String[] args) {
        //先计算20的22次方
        BigInteger bi=new BigInteger("20");
        //20的22次方的运行结果
        BigInteger res=new BigInteger("1");
        for(int i=0;i<22;i++){
            //BigInteger是一个类,加减乘除和取模等运算都是调用
            res=res.multiply(bi);
            System.out.println(i+1+"次方的结果"+res.toString());
        }
        System.out.println("------------");
        System.out.println(res.toString());
        System.out.println("------------");
        BigInteger mo=new BigInteger("7");
        //一周七天,将res%7;
        res=res.remainder(mo);
        //计算出1,然后在周六的基础上加一
        System.out.println(res.toString());
        }
    }

十四,阶乘求和JavaB(14届) 

方法一: 

import java.math.BigInteger;
public class L1 {

    public static void main(String[] args) {
        BigInteger n=new BigInteger("1");
        BigInteger sum=new BigInteger("0");
        for(int i=1;i<50;i++) {
            n=n.multiply(new BigInteger(""+i));
            sum=sum.add(n);
            System.out.println("i="+i+"时,sum后九位是:"+sum.mod(new BigInteger(""+1000000000)));
        }
    }
}

方法2:利用for循环

import java.util.Scanner;

public class myPractice {

	public static int sumFac(int n) {
        int sum = 0;
        for (int i = 1; i <= n; i++) {
            int ret = 1;
            for (int j = 1; j <= i; j++) {
                ret *= j; // ret = ret * j;
            }
            sum += ret; // sum = sum + ret;
        }
        return sum;
    }

	public static void main(String[] args) { // m4
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int ret = sumFac(n);  //方法二
        System.out.println(n + " 的阶乘和为:" + ret);
    }
}

十五,买二赠一JavaB(14) 

 思路:将他们的价格进行从小到大排列放入一个数组中,从后向前买可以免费,买两个可免费一个,进行遍历数组,引入一个队列,如果原数组有比这个小的值,直接往前走。

package 蓝桥杯备赛;
 
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.concurrent.ConcurrentLinkedQueue;
 
public class 买二赠一 {
 
	public static void main(String[] args) {
		//写入数据
		Scanner scan = new Scanner(System.in);
		int number;
		number = scan.nextInt();
		int price[] = new int[number];
		for(int i=0;i<number;i++) {
			price[i] = scan.nextInt();
		}
		long res = 0;
		scan.close();
		Arrays.sort(price);
		
		int t = number-1;
		Queue<Integer> queue = new LinkedList<>();
		boolean flag = false;
		
		while(t>=0) {
			if(!queue.isEmpty()&&price[t]<=queue.peek()) {//如果队列非空且价格小于队列的第一个元素。queue.peek只会获取队列头部元素,不会删除。
				queue.poll();//出队列
			}
			else {
				if(flag) {
					queue.add(price[t]/2);
					flag = false;
				}
				else {
					flag = true;
				}
				res += price[t];
			}
			t--;
		}
		System.out.print(res);
	
	}
}
 

十六,矩形总面积JavaB(14届) 

思路:总面积减去重叠面积,不重叠的话,重叠面积就是0,不用考虑特殊情况了

找到其中的规律

import java.util.Scanner;
public class L2 {
    public  static void main(String []args){
Scanner sc=new Scanner(System.in);
        int x1=sc.nextInt();
        int y1=sc.nextInt();
        int x2=sc.nextInt();
        int y2=sc.nextInt();
        int x3=sc.nextInt();
        int y3=sc.nextInt();
        int x4=sc.nextInt();
        int y4=sc.nextInt();
        //总面积减去重叠面积,先计算总面积
        long sum=(long)(x2-x1)*(y2-y1)+(long)(x4-x3)*(y4-y3);
        //重叠面积
        long width=Math.max(x1,x3)-Math.min(x2,x4);
        long high=Math.min(y2,y4)-Math.max(y1,y3);
        //判断是否有重叠面积
        if(width>0&&high>0){
            sum=sum-width*high;
        }
        System.out.println(sum);

    }
}

十七,幸运数字JavaB(14届)

public class Main{
    public static void main(String[] args) {
        int j=0;
        for (int i=1;i<10000000;i++){
            if (BaseConversion(i)){
                j++;
                if (j==2023){
                    System.out.println(i);//215040
                    break;
                }
            }
        }
    }
    public static boolean BaseConversion(int n){
        //十进制
        int sum=0;
        int x=n;
        while (x!=0){
            sum+=(x%10);
            x/=10;
        }
        if (n%sum!=0)
            return false;
        //二进制
        sum=0;
        x=n;
        while (x!=0){
            sum+=(x%2);
            x/=2;
        }
        if (n%sum!=0)
            return false;
        //八进制
        sum=0;
        x=n;
        while (x!=0){
            sum+=(x%8);
            x/=8;
        }
        if (n%sum!=0)
            return false;
        //十六进制
        int[] arr={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        sum=0;
        x=n;
        while (x!=0){
            sum+=(arr[x%16]);
            x/=16;
        }
        if (n%sum!=0)
            return false;
        return true;
    }
}
 



十八, 一步之遥

从昏迷中醒来,小明发现自己被关在X星球的废矿车里。
矿车停在平直的废弃的轨道上。
他的面前是两个按钮,分别写着“F”和“B”。

小明突然记起来,这两个按钮可以控制矿车在轨道上前进和后退。
按F,会前进97米。按B会后退127米。
透过昏暗的灯光,小明看到自己前方1米远正好有个监控探头。
他必须设法使得矿车正好停在摄像头的下方,才有机会争取同伴的援助。
或许,通过多次操作F和B可以办到。

矿车上的动力已经不太足,黄色的警示灯在默默闪烁…
每次进行 F 或 B 操作都会消耗一定的能量。
小明飞快地计算,至少要多少次操作,才能把矿车准确地停在前方1米远的地方。

请填写为了达成目标,最少需要操作的次数。

public class L0{

        public static void main(String[] args) {
            for (int i = 1; i < 100; i++) {
                for (int j = 1; j < 100; j++) {
                    if (i * 97 - j * 127 == 1) {
                        System.out.println(i+j);
                    }
                }
            }}}

Integer.MAX_VALUE表示int数据类型的最大取值数:2 147 483 647
Integer.MIN_VALUE表示int数据类型的最小取值数:-2 147 483 648

String类型有一个方法:contains(),该方法是判断字符串中是否有子字符串。如果有则返回true,如果没有则返回false。

import java.util.ArrayList;

public class L0{

    public static ArrayList<Integer> list=new ArrayList<Integer>();
    public static int f(int a, int b){
    if(b>200||list.contains(a)){
        return Integer.MAX_VALUE;
    }
    list.add(a);
    if(a==11)return b;
    return Math.min(f(a+97,b+1),f(a-127,b+1));
}
        public static void main(String[] args) {
            
                        System.out.println(f(0,0));
                    }
                }
            v

 十九,求最大公约数和最小公倍数-进制整除法

运用欧几里得算法

//欧几里得算法,求最大公约数,gcd(A,B)
public class L0{
static int gcd(int a,int b){
    if(b==0) return a;
    return gcd(b,a%b);
}

    public static void main(String[] args){
System.out.println(gcd(60,42));
}}
//欧几里得算法,求最大公约数,gcd(A,B)
//最小公倍数,算数基本定理,质因数分解的唯一性
public class L0{
static int gcd(int a,int b){
    if(b==0) return a;
    return gcd(b,a%b);
}
static int lcm(int a,int b){
    return a*b/gcd(a,b);
}

    public static void main(String[] args){
System.out.println(gcd(60,42));
System.out.println(lcm(60,42));
}}

 //直接计算

import java.util.Scanner;
public class L1{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int m=sc.nextInt();
        int n=sc.nextInt();
        System.out.println("请分别输入两个整数"+m+" "+n);
        int min=m<n?m:n;
        for(int i=min;i>0;i--){//从大到小除,第一个救是最大公约数
            if(m%i==0&&n%i==0){
                min=i;//最大公约数;
                break;
            }
            int max=(m*n)/min;
            System.out.println("最大公约数,最小公倍数分别为:"+max+"   "+min);
        }
    }
}

二十,天平称重-进制与整除 

用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。

如果只有5个砝码,重量分别是1,3,9,27,81

则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中)。

本题目要求编程实现:对用户给定的重量,给出砝码组合方案。

例如:

用户输入:

5

程序输出:

9-3-1

用户输入:

19

程序输出:

27-9+1

要求程序输出的组合总是大数在前小数在后。

可以假设用户的输入的数字符合范围1~121

思路:首先列举出前几位数字,找规律

replace的用法,替换旧字符串,形成新字符串

public class L0{
static String reve(String s){
    //正负变号
    s=s.replace("#","+");
    s=s.replace("-","#");
    s=s.replace("#","+");
    return "-"+s;
}
    static String f(int x){
        int a=1;
        while(a<x)a=a*3;
        if(a==x)return ""+a;
        if(x<=a/2)return a/3+"+"+f(x-a/3);
        return a+reve(f(a-x));
    }

    public static void main(String[] args){
        for(int i=1;i<100;i++){
System.out.println(i+"+"+"="+f(i));
    }
}}

 二十一,杨辉三角

杨辉三角的数值部分实现

//杨辉三角
//1,创建一个二维数组
//2,寻找二维数组之间的关系并输出
public class A0 {
    public static void main(String []args){
      int[][] arr=new int[10][10];
      for(int i=0;i<arr.length;i++){
          for(int j=0;j<=i;j++){
              if(j==0||j==i){
               arr[i][j]=1;}
                  else{
                      arr[i][j]=arr[i-1][j-1]+arr[i-1][j];
                      }
                  System.out.println(arr[i][j]);
              }
          }

      }

    }

二十二,递归-振兴中华 

小明参加了学校的趣味运动会,其中的一个项目是:跳格子。地上画着一些格子,每个格子里写一个字
从我做起振
我做起振兴
做起振兴中
起振兴中华
比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位
置。一直要跳到“华”字结束。 要求跳过的路线刚好构成“从我做起振兴中华”这句话。
请你帮助小明算一算他一共有多少种可能的跳跃路线呢?
答案是一个整数,请通过浏览器直接提交该数字。
注意:不要提交解答过程,或其它辅助说明类的内容。
————————————————                        
原文链接:https://blog.csdn.net/weixin_55054681/article/details/124139989

思路:将其想象为一个坐标系,只能向下或者向右移动,横坐标加一或者纵坐标加一,进行循环

public class L0 {
    public static int f(int a,int b){
        if(a==4||b==3)return 1;
        else return(f(a+1,b)+f(b+1,a));
    }

    public static void main(String[] args){
int a=f(0,0);
System.out.println(a);
    }

二十三,暴力枚举-罗马逆向数字 

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。

示例 1:

输入: “III”
输出: 3
示例 2:

输入: “IV”
输出: 4
示例 3:

输入: “IX”
输出: 9
示例 4:

输入: “LVIII”
输出: 58
解释: L = 50, V= 5, III = 3.
示例 5:

输入: “MCMXCIV”
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.

提示:

1 <= s.length <= 15
s 仅含字符 (‘I’, ‘V’, ‘X’, ‘L’, ‘C’, ‘D’, ‘M’)
题目数据保证 s 是一个有效的罗马数字,且表示整数在范围 [1, 3999] 内
题目所给测试用例皆符合罗马数字书写规则,不会出现跨位等情况。
IL 和 IM 这样的例子并不符合题目要求,49 应该写作 XLIX,999 应该写作 CMXCIX 。
关于罗马数字的详尽书写规则,可以参考 罗马数字 - Mathematics 。

思路:将某一个数进行拆分成各个位,进行组合分析。拆开列举组合

public class L0 {
    static String NumRoman(int x){
        //首先确定各个位数
        int a=x/1000;
        int b=x%1000/100;
        int c=x%100/10;
        int d=x%10;
        String s="";
        //枚举各个数值
        if(a==1)s+="M";
        if(a==2)s+="MM";
        if(a==3)s+="MMM";
        if(a==4)s+="MMMM";
        if(b==1)s+="C";
        if(b==2)s+="CC";
        if(b==3)s+="CCC";
        if(b==4)s+="CD";
        if(b==5)s+="D";
        if(b==6)s+="DC";
        if(b==7)s+="DCC";
        if(b==8)s+="DCCC";
        if(b==9)s+="CM";
        if(c==1)s+="X";
        if(c==2)s+="XX";
        if(c==3)s+="XXX";
        if(c==4)s+="XL";
        if(c==5)s+="L";
        if(c==6)s+="LX";
        if(c==7)s+="LXX";
        if(c==8)s+="LXXX";
        if(c==9)s+="XC";
        if(d==1)s+="|";
        if(d==2)s+="||";
        if(d==3)s+="|||";
        if(d==4)s+="|V";
        if(d==5)s+="V";
        if(d==6)s+="V|";
        if(d==7)s+="V||";
        if(d==8)s+="V|||";
        if(d==9)s+="|X";
        return s;

    }
    //判断罗马数字是否正确
    static boolean RomanNumOK(String s){
        for(int i=0;i<4000;i++){
            if(s.equals(NumRoman(i)))return true;

        }
        return false;
    }
    public static void main(String []args){
        System.out.println(RomanNumOK("ccxx"));
        System.out.println(NumRoman(1234));
    }
}

二十四,二进制中1的个数(位运算) 

import java.util.Scanner;

//换算二进制,1的个数
public class A0 {
    public static void main(String []args){
        Scanner sc=new Scanner(System.in);
        int N=sc.nextInt();
        System.out.println(Integer.toString(N,2));
        int count=0;
        //比对每一位
        for(int i=0;i<32;i++){
            if((N&(1<<i))==(1<<i)){//将每个1往左移,判断1的位数
                count++;
            }
           /* if(((N>>>i)&1)==1){
                count++;
            }*/
        }
System.out.println(count);

    }
}

二十五,用一条语句判断一个整数是不是2的整数次方(位运算) 

import java.util.Scanner;

//用一条语句判断一个整数是不是2的整数次方
public class A1 {
    public static void main(String []args){
        Scanner sc=new Scanner(System.in);
        int b=sc.nextInt();
        if(((b-1)&b)==0){
        System.out.println("是2的整数次方");
} else{
            System.out.println("不是2的整数次方");
        }
    }
}

二十六,最少砝码 

import java.util.Scanner;
public class L1{
    public static void main(String[] args){
 Scanner sc=new Scanner(System.in);
 int n=sc.nextInt();
 int n1=1;
 int n2=1;
 int total=1;
 while(total<n){
     n1++;
     n2=n2*3;
     total+=n2;
     }
 System.out.println(n1);
 }
       }

二十七,递归-找钱问题 

公园票价为5角。假设每位游客只持有两种币值的货币:5角、1元。

再假设持有5角的有m人,持有1元的有n人。

由于特殊情况,开始的时候,售票员没有零钱可找。

我们想知道这m+n名游客以什么样的顺序购票则可以顺利完成购票过程。

显然,m < n的时候,无论如何都不能完成;

m>=n的时候,有些情况也不行。比如,第一个购票的乘客就持有1元。

请计算出这m+n名游客所有可能顺利完成购票的不同情况的组合数目。

注意:只关心5角和1元交替出现的次序的不同排列,持有同样币值的两名游客交换位置并不算做一种新的情况来计数。

思路:递归,考虑可能出现的不同可能,从后往前逐步分析0.5与1的个数

public class L0 {
    public static int c(int m,int n){
        if(m==0)return 0;
        if(n==0)return 1;
        if(m<n)return 0;
        if(m==1&&n==1)return 1;
        return c(m-1,n)+c(n-1,m);
    }

    public static void main(String[] args){
System.out.println(c(2,3));
    }
}

二十八,暴力枚举-罗马数字的枚举解法

古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候,现在看起来简直不能忍受,所以在现代很少使用了。
之所以这样,不是因为发明表示法的人的智力的问题,而是因为一个宗教的原因,当时的宗教禁止在数字中出现0的概念!
罗马数字的表示主要依赖以下几个基本符号:


I --> 1
V --> 5
X --> 10
L --> 50
C --> 100
D --> 500
M --> 1000


这里,我们只介绍一下1000以内的数字的表示法。
单个符号重复多少次,就表示多少倍。最多重复3次。
比如:CCC表示300  XX表示20,但150并不用LLL表示,这个规则仅适用于I X C M。


如果相邻级别的大单位在右,小单位在左,表示大单位中扣除小单位。
比如:IX表示9  IV表示4  XL表示40 
49 = XLIX
    
更多的示例参见下表,你找到规律了吗?    
I = 1 
II = 2
III = 3
IV = 4
V = 5
VI = 6
VII = 7
VIII = 8
IX = 9 
X = 10
XI = 11
XII = 12
XIII = 13
XIV = 14
XV = 15
XVI = 16
XVII = 17
XVIII = 18
XIX = 19
XX = 20
XXI = 21
XXII = 22
XXIX = 29
XXX = 30
XXXIV = 34
XXXV = 35
XXXIX = 39
XL = 40
L = 50
LI = 51
LV = 55
LX = 60
LXV = 65
LXXX = 80
XC = 90
XCIII = 93
XCV = 95
XCVIII = 98
XCIX = 99
C = 100
CC = 200
CCC = 300
CD = 400
D = 500
DC = 600
DCC = 700
DCCC = 800
CM = 900
CMXCIX = 999


本题目的要求是:请编写程序,由用户输入若干个罗马数字串,程序输出对应的十进制表示。


输入格式是:第一行是整数n,表示接下来有n个罗马数字(n<100)。
以后每行一个罗马数字。罗马数字大小不超过999。
要求程序输出n行,就是罗马数字对应的十进制数据。


例如,用户输入:
3
LXXX
XCIII
DCCII


则程序应该输出:
80
93
702

思路:以单个字符的形式,合成数字相加

public class L0 {
    public static int romeName(String s){
        int sum=0;
        for(int i=0;i<s.length();i++){
            char c=s.charAt(i);//字符是单引号,转换为字符
            if(c=='|')sum+=1;//c
            if(c=='V')sum+=5;
            if(c=='X')sum+=10;
            if(c=='L')sum+=50;
            if(c=='C')sum+=100;
            if(c=='D')sum+=500;
            if(c=='M')sum+=1000;
        }
        return sum;
    }
    public static void main(String[] args){
System.out.println(romeName("CCXX"));
    }
}

二十九,暴力枚举-利用位数猜年龄

美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:“我年龄的立方是个4位数。我年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。”请你推算一下,他当时到底有多年轻。

思路:利用for循环,枚举,排除法

public class L0 {
    public static void main(String[] args){
    for(int i=1;i<100;i++){
    int a=i*i*i;
    int b=a*i;
    if(((a+"").length())!=4)continue;//注意是(a+“”)
    if(((b+"").length())!=6)continue;
    System.out.println(i+"="+a+" "+b);
}
    }
}

三十,幸运数字

【问题描述】

哈沙德数是指在某个固定的进位制当中,可以被各位数字之和整除的正整 数。例如 126 是十进制下的一个哈沙德数,因为 (126) 10 mod (1+2+6) = 0 ; 126 也是八进制下的哈沙德数,因为 (126) 10 = (176) 8 , (126) 10 mod (1 + 7 + 6) = 0 ; 同时 126 也是 16 进制下的哈沙德数,因为 (126) 10 = (7 e ) 16 , (126) 10 mod (7 + e ) = 0 。小蓝认为,如果一个整数在二进制、八进制、十进制、十六进制下均为 哈沙德数,那么这个数字就是幸运数字,第 1 至第 10 个幸运数字的十进制表示 为:1 , 2 , 4 , 6 , 8 , 40 , 48 , 72 , 120 , 126 . . . 。现在他想知道第 2023 个幸运数 字是多少?你只需要告诉小蓝这个整数的十进制表示即可。

public class Main{

    public static void main(String[] args) {

        int j=0;

        for (int i=1;i<10000000;i++){

            if (BaseConversion(i)){

                j++;

                if (j==2023){

                    System.out.println(i);//215040

                    break;

                }

            }

        }

    }

    public static boolean BaseConversion(int n){

        //十进制

        int sum=0;

        int x=n;

        while (x!=0){

            sum+=(x%10);

            x/=10;

        }

        if (n%sum!=0)

            return false;

        //二进制

        sum=0;

        x=n;

        while (x!=0){

            sum+=(x%2);

            x/=2;

        }

        if (n%sum!=0)

            return false;

        //八进制

        sum=0;

        x=n;

        while (x!=0){

            sum+=(x%8);

            x/=8;

        }

        if (n%sum!=0)

            return false;

        //十六进制

        int[] arr={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

        sum=0;

        x=n;

        while (x!=0){

            sum+=(arr[x%16]);

            x/=16;

        }

        if (n%sum!=0)

            return false;

        return true;

    }

}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
2022蓝桥杯javab组真题解析如下: 2022年蓝桥杯javab组真题从基础到进阶,难度适中,测试了参赛选手在Java编程语言方面的知识和能力。题目涵盖了数组、字符串处理、面向对象编程等多个知识点,考察了学生的编程思维和解决问题的能力。 首先,题目要求实现一个学生成绩管理系统,包括学生信息录入、成绩查询、成绩统计等功能。通过类的设计和实例化,可以实现学生对象的创建和信息存储。使用数组或集合来存储多个学生对象,便于后续的查询和统计操作。 其次,题目要求实现一个简单的买卖股票的交易系统。需要设计一个股票类,其中包括股票名称、日期、买入价、卖出价等属性,然后通过输入的交易数据进行统计,计算利润最大化的买入和卖出操作。可以使用循环和条件语句来实现逻辑判断和计算运算。 最后,题目要求实现一个小型的计算器程序。可以通过实现不同的方法来实现加、减、乘、除等基本运算。可以使用条件语句或循环语句来判断用户输入的操作,并进行相应的计算操作。 总结来说,2022蓝桥杯javab组真题考察了参赛选手的编程能力和应用基础知识的能力,要求实现多个功能,并考察了类的设计和对象的使用。通过解析这些真题,可以提高对Java编程语言的理解和应用能力,对于参加类似的编程竞赛有一定的帮助作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值