蓝桥杯Java B 组
题目大致介绍:
第一题到第三题以及第六题是结果填空,方法不限得到最后结果就行。
第四题和第五题是代码填空题,主要考察算法基本功和编程基本功。
第八题到第十题是编程题,要求编程解决问题。
各题目分数:
- 结果填空 (满分2分)
- 结果填空 (满分5分)
- 结果填空 (满分6分)
- 代码填空 (满分4分)
- 代码填空 (满分9分)
- 结果填空 (满分11分)
- 结果填空 (满分15分)
- 程序设计(满分7分)
- 程序设计(满分18分)
- 程序设计(满分23分)
1.1 世纪末的星期
曾有邪教称1999年2月31日是世界末日。当然该谣言已经不攻自破。
还有人称今后的某个世纪末的12月31日,如果是星期-则会…
有趣的是,任何一个世纪末的年份的12月31日都不可能是星期一!!
于是,“谣言制造商”又修改为星期…
1999年的12月31日是星期五,请问:未来哪一个离我们最近的一个世纪末年(即xx99年) 的12月31日正好是星期天(即星期日) ?
请回答该年份(只写这个4位整数,不要写12月31等多余信息)
import java.util.Calendar;
import java.util.Iterator;
import javax.imageio.metadata.IIOMetadataFormatImpl;
public class _01世纪末的星期 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Calendar calendar = Calendar.getInstance();
for(int year = 1999; year < 10000; year+=100) {
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, 11);//12月
calendar.set(Calendar.DAY_OF_MONTH, 31);
System.out.println(year+" "+calendar.get(Calendar.DAY_OF_WEEK));
if (calendar.get(Calendar.DAY_OF_WEEK)==1) {
break;
}
}
}
}
1.2 马虎的算式
小明是个急性子,工上小学的时候经常把老师写在黑板上的题目抄错了。
有一次,老师出的题目是: 36 x 495 = ?
他却给抄成了: 396 x 45 = ?
但结果却很戏剧性,他的答案竟然是对的! !
因为36495=39645=17820
类似这样的巧合情况可能还有很多,比如: 27 * 594 = 297 * 54
假设a b C d e代表1~9不同的5个数字(注意是各不相同的数字,且不含0)
能满足形如: ab * cde = adb * ce这样的算式一共有多 少种呢?
请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。
满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。
答案直接通过浏览器提交。
import org.w3c.dom.ls.LSOutput;
public class _02马虎的算式_枚举 {
public static void main(String[] args) {
int ans=0;
for (int a = 1; a < 10; a++) {
for (int b = 1; b < 10; b++) {
if (a!=b) for (int c = 1; c < 10; c++) {
if (c!=a && c!=b) for (int d = 1; d < 10; d++) {
if (d!=a && d!=b && d!=c) for (int e = 1; e < 10; e++) {
if (e!=a && e!=b && e!=c && e!=d) {
if ((a*10+b)*(c*100+d*10+e)==(a*100+d*10+b)*(c*10+e)) {
ans++;
System.out.printf("(%d*10+%d)*(%d*100+%d*10+%d)==(%d*100+%d*10+%d)* (%d*10+%d)==%d\n",a,b,c,d,e,a,d,b,c,e,(a*100+d*10+b)*(c*10+e));
}
}
}
}
}
}
}
System.out.println(ans);
}
}
1.3 振兴中华
小明参加 了学校的趣味运动会,其中的一个项目是:跳格子。
地上画着-些格子,每个格子里写-一个字,如下所示:
比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里, 但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。
要求跳过的路线刚好构成“从我做起振兴中华”这句话。
请你帮助小明算-算他一 共有多少种可能的跳跃路线呢?
答案是一个整数,请通过浏览器直接提交该数字。
package _2013;
public class _03振兴中华 {
public static void main(String[] args) {
//使用递归 注意点
//重复
//变化
//边界
int ans = f(0,0);
System.out.println(ans);
}
private static int f(int i ,int j) {
if (i == 3 || j == 4) return 1;
return f(i+1,j) + f(i, j+1);//向下或向右 将两种走向的方法相加
}
}
1.4 黄金连分数(填空题)
黄金分割数0.61803…是个无理数,这个常数十分重要,在许多工程问题中会出现。有时需要把这个数字求得很精确。
对于某些精密工程,常数的精度很重要。也许你听说过哈勃太空望远镜,它首次升空后就发现了-处人工加工错误,对那样-个庞然大物, 其实
言归正传,我们如何求得黄金分割数的尽可能精确的值呢?有许多方法。
比较简单的-种是用连分数:
这个连分数计算的“层数”越多,它的值越接近 黄金分割数。
请你利用这一特性, 求出黄金分割数的足够精确值,要求四舍五入到小数点后100位。
小数点后3位的值为: 0. 618
小数点后4位的值为: 0. 6180
小数点后5位的值为: 0. 61803
小数点后7位的值为: 0. 6180340
(注意尾部的0,不能忽略)
你的任务是:写出精确到小数点后100位精度的黄金分割值。
注意:尾数的四舍五入!尾数是0也要保留!
package _2013;
import java.math.BigDecimal;
import java.math.BigInteger;
//1.化为求斐波那契相邻两项的比值,到多少项?越多越精确, n/n+1项, n再往上增加,这个比值的小数点后101位是稳定的, 也就是不变的
//2. double无法表示100亿小数、BiaIntecer和BiTDecimal
public class _04黄金连分数 {
/* public static void main(String[] args) {
double a=1.0;
double b=1.0;
for (int i = 3; i < 100; i++) {
double t = b;
b = a+b;
a=t;
}
System.out.println(a/b);
}
*/
public static void main(String[] args) {
BigInteger a = BigInteger.ONE;
BigInteger b = BigInteger.ONE;
for (int i = 3; i < 500; i++) {
BigInteger t = b;
b = a.add(b);
a = t;
}
BigDecimal divide = new BigDecimal(a,110).divide(new BigDecimal(b,110),BigDecimal.ROUND_HALF_DOWN);
System.out.println(divide.toPlainString().substring(0,103));
}
}
//0.61803398874989484820458683436563811772030917980576286213544862270526046281890244969233401224637257135
1.5 有理数类
有理数就是可以表示为两个整数的比值的数字。一 -般情况下,我们用近似的小数表示。但有些时候,不允许出现误差,必须用两个整数来表示一 一个有理数。
这时,我们可以建立- 个“有理数类”, 下面的代码初步实现了这个目标。为了简明,它只提供了加法和乘法运算。
题目
class Rational
{
private long ra;
private long rb;
private long gcd(long a, long b){
if(b==0) return a;
return gcd(b,a%b);
}
public Rational(long a, long b){
ra = a;
rb = b;
long k = gcd(ra,rb);
if(k>1){ //需要约分
ra /= k;
rb /= k;
}
}
// 加法
public Rational add(Rational x){
return ________________________________________;//填空位置
return new Rational(ra * x.rb + rb * x.ra, rb * x.rb);//答案
return new Rational(this.ra * x.rb + x.ra * this.rb ,this.rb * x.rb);//答案
}
// 乘法
public Rational mul(Rational x){
return new Rational(ra*x.ra, rb*x.rb);
}
public String toString(){
if(rb==1) return "" + ra;
return ra + "/" + rb;
}
}
计算
package _2013;
import java.util.Calendar;
public class _05有理数类填空题 {
public static void main(String[] args) {
Rational a = new Rational(1, 3);
Rational b = new Rational(1, 6);
Rational c = a.add(b);
System.out.println(a+"+"+b+"="+c);
}
static class Rational{
private long ra;
private long rb;
private long gcd(long a,long b) {
if (b == 0) return a;
return gcd(b, a%b);
}
public Rational (long a, long b) {
ra = a;
rb = b;
long k = gcd(ra,rb);
if (k > 1) { //需要约分
ra /= k;
rb /= k;
}
}
//加法
public Rational add(Rational x) {
return new Rational(this.ra * x.rb + x.ra * this.rb ,this.rb * x.rb); //填空位置
}
//乘法
public Rational mul(Rational x) {
return new Rational(ra*x.ra,rb*x.rb);
}
public String tosString() {
if (rb == 1) return "" + ra;
return ra + "/" +rb;
}
}
}