【蓝桥杯Java真题详解】简单题练习(一)

本文探讨了几个经典问题:棋盘麦粒问题展示算法计算的巨大潜力,猜生日和年龄揭示数学谜题的巧妙,汉诺塔演示递归策略的精妙,李白打酒揭示组合计数,而组素数问题聚焦于数字组合的独特素数生成。通过编程解决,这些题目展示了信息技术在实际问题中的应用和算法思维的重要性。
摘要由CSDN通过智能技术生成

前言

简单题要做的又快又好又对!!

棋盘放麦子

题目描述

你一定听说过这个故事。国王对发明国际象棋的大臣很佩服,问他要什么报酬,大臣说:请在第 1 个棋盘格放 1 粒麦子,在第 2 个棋盘格放 2 粒麦子,在第 3 个棋盘格放 4 粒麦子,在第 4 个棋盘格放 8 粒麦子,…后一格的数字是前一格的两倍,直到放完所有棋盘格(国际象棋共有 64 格)。

国王以为他只是想要一袋麦子而已,哈哈大笑。

当时的条件下无法准确计算,但估算结果令人吃惊:即使全世界都铺满麦子也不够用!

请你借助计算机准确地计算,到底需要多少粒麦子。

参考代码


import java.math.BigInteger;

public class Main {
    public static void main (String[] arge) {
        BigInteger a =new BigInteger("0");
        BigInteger b = new BigInteger("2");
        for (int i = 0; i < 64; i++) {
            a = a.add(b.pow(i));
        }
        System.out.println(a);
    }
}

答案:18446744073709551615

猜生日

题目描述

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

今年的植树节(20122012 年 33 月 1212 日),小明和他的叔叔还有小伙伴们一起去植树。休息的时候,小明的同学问他叔叔多大年纪,他叔叔说:“我说个题目,看你们谁先猜出来!”

“把我出生的年月日连起来拼成一个 88 位数(月、日不足两位前补 00)正好可以被今天的年、月、日整除!”

他想了想,又补充到:“再给个提示,我是 66 月出生的。”

根据这些信息,请你帮小明算一下,他叔叔的出生年月日。

格式是年月日连成的 88 位数。例如,如果是 19481948 年 66 月 1212 日,就写:1948061219480612。

参考代码



public class Main {
 public static void main(String[] args) {
     int i,j,sum;
     for(i=1900;i<2020;i++){
       for(j=1;j<=30;j++){
           sum=i*10000+600+j;
           if(sum%2012==0 && sum%3==0 && sum%12==0){
             System.out.println(sum);
           }
       }
     }
 }
}

答案:19550604

汉诺塔

题目描述

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

汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。

大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着 64 片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上(可以借助第三根柱子做缓冲)。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

如下图所示是现代“山寨”版的该玩具。64 个圆盘太多了,所以减为 7 个,金刚石和黄金都以木头代替了…但道理是相同的。

在这里插入图片描述

据说完成大梵天的命令需要太多的移动次数,以至被认为完成之时就是世界末日!

你的任务是精确计算出到底需要移动多少次。

很明显,如果只有 2 个圆盘,需要移动 3 次。

圆盘数为 3,则需要移动 7 次。

那么 64 个呢?

解题思路

import java.math.BigInteger;


public class Main {
    public static void main(String[] args) {
        BigInteger bigInteger = new BigInteger(2+"");
        System.out.println(bigInteger.pow(64).subtract(new BigInteger(1+"")));
    }
}

答案:18446744073709551615

李白打酒

题目描述

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

话说大诗人李白,一生好饮。幸好他从不开车。

一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:

无事街上走,提壶去打酒。 逢店加一倍,遇花喝一斗。

这一路上,他一共遇到店5次,遇到花 10次,已知最后一次遇到的是花,他正好把酒喝光了。

请你计算李白遇到店和花的次序,可以把遇店记为 a,遇花记为 b。
则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。

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

参考代码

public class Main {
	static int count=0;
	public static void main(String[] args) {
		f(2,5,10);
		System.out.println(count);
	}

	private static void f(int n,int a,int b) {
		if(n<0||a<0||b<0) {
			return;
		}
		if(n==1&&a==0&&b==1) {
			count++;
			return;
		}
		f(n*2, a-1, b);
		f(n-1, a, b-1);
	}
}

答案:14

猜年龄

题目描述

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

美国数学家维纳智力早熟,11 岁就上了大学。他曾在 1935 ~ 1936 年应邀来中国清华大学讲学。

一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:

“我年龄的立方是个 4 位数。我年龄的 4 次方是个6 位数。这 10 个数字正好包含了从 0 到 9 这 10 个数字,每个都恰好出现 1次。”

请你推算一下,他当时到底有多年轻。

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

参考代码

import java.util.HashSet;

public class Main {
	public static void main(String[] args) {
		HashSet<Character> set = new HashSet<Character>();
		for (int i = 11; i <100; i++) {
			set.clear();
			int t=(int) Math.pow(i, 3);
			int f=(int) Math.pow(i, 4);
			String string=""+t+f;
			for (int j = 0; j < string.length(); j++) {
				set.add(string.charAt(j));
			}
			if (set.size()==10) {
				System.out.println(i);
				break;
			}
		}
	}
}

答案:18

组素数

题目描述

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

素数就是不能再进行等分的数。比如:2 3 5 7 11 等。9=3∗3 说明它可以3等分,因而不是素数。

我们国家在 1949 年建国。如果只给你 1 9 4 9 这 4 个数字卡片,可以随意摆放它们的先后顺序(但卡片不能倒着摆放啊,我们不是在脑筋急转弯!),那么,你能组成多少个 4 位的素数呢?

比如:1949,4919 都符合要求。

请你输出能组成的 44 位素数的个数,不要罗列这些素数!!

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

参考代码

package timeProblem;

import java.util.ArrayList;


public class Main {
    public static void main(String[] args) {
    int[] arr= {1,9,4,9};
    ArrayList<Integer> as=new ArrayList<>();
    int num=0;
    int sum=0;
    boolean b=true;
    for(int i=0;i<arr.length;i++) {
        for(int j=0;j<arr.length;j++) {
            for(int k=0;k<arr.length;k++) {
                for(int l=0;l<arr.length;l++) {
                    num=arr[i]*1000+arr[j]*100+arr[k]*10+arr[l];
                    if(i!=j && i!=k && i!=l && j!=k && j!=l && k!=l) {
                        for(int a=2;a<num;a++) {
                            if(num%a==0) {
                                b=false;
                                break;
                            }
                        }    
                        if(b && as.indexOf(num)<0) {
                            as.add(num);
                            sum++;
                        }
                        b=true;
                    }        
                    
                }
            }
        }
    }
    System.out.println(sum);
    }
}


答案:6

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疼疼蛇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值