第五届蓝桥杯javaC组真题

第n级台阶

有n级台阶。从地面(第0级)出发,首先连续的上台阶,上到不超过第n级的
某一个位置后再连续的下台阶,直到回到地面。若每次上下台阶只允许走1级或2级,
请问可能的上下台阶的方案数是多少?
特别地,在0级站着不动也算一种方案。

数据格式:

输入一行包含两个正整数n和m。
输出一个整数,表示n级台阶有多少种合法的走楼梯方案,答案对m取余。

例如:输入:
2 10007
程序应该输出
6

import java.util.Scanner;

/**
 * @createDate:2019年3月14日 下午12:16:24
 * @porjectName:lanqiao
 * @author Static
 * @version 1.0
 * @since JDK 1.8.0_21
 * @filename:n级台阶.java @describe:
 */
public class n级台阶 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int sum = 0, temp;
		for (int i = 0; i <= n; i++) {
			temp = fun(i);
			sum += temp * temp;
		}
		System.out.println(sum % m);
	}

	public static int fun(int n) {
		if (n < 0)
			return 0;
		if (n == 0)
			return 1;
		return fun(n - 1) + fun(n - 2);
	}
}

兰顿蚂蚁

兰顿蚂蚁,是于1986年,由克里斯·兰顿提出来的,属于细胞自动机的一种。

平面上的正方形格子被填上黑色或白色。在其中一格正方形内有一只“蚂蚁”。
蚂蚁的头部朝向为:上下左右其中一方。

蚂蚁的移动规则十分简单:
若蚂蚁在黑格,右转90度,将该格改为白格,并向前移一格;
若蚂蚁在白格,左转90度,将该格改为黑格,并向前移一格。

规则虽然简单,蚂蚁的行为却十分复杂。刚刚开始时留下的路线都会有接近对称,
像是会重复,但不论起始状态如何,蚂蚁经过漫长的混乱活动后,会开辟出一条规则的“高速公路”。

蚂蚁的路线是很难事先预测的。

你的任务是根据初始状态,用计算机模拟兰顿蚂蚁在第n步行走后所处的位置。

【数据格式】

输入数据的第一行是 m n 两个整数(3 < m, n < 100),表示正方形格子的行数和列数。
接下来是 m 行数据。
每行数据为 n 个被空格分开的数字。0 表示白格,1 表示黑格。

接下来是一行数据:x y s k, 其中x y为整数,表示蚂蚁所在行号和列号(行号从上到下增长,
列号从左到右增长,都是从0开始编号)。s 是一个大写字母,表示蚂蚁头的朝向,
我们约定:上下左右分别用:UDLR表示。k 表示蚂蚁走的步数。

输出数据为两个空格分开的整数 p q, 分别表示蚂蚁在k步后,所处格子的行号和列号。

 * 程序输出:  

例如, 输入:
5 6
0 0 0 0 0 0
0 0 0 0 0 0
0 0 1 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
2 3 L 5
程序应该输出:
1 3

再例如, 输入:
3 3
0 0 0
1 1 1
1 1 1
1 1 U 6
程序应该输出:
0 0

import java.util.Scanner;

/**
 * @createDate:2019年3月14日 下午2:36:28
 * @porjectName:lanqiao
 * @author Static
 * @version 1.0
 * @since JDK 1.8.0_21
 * @filename:兰顿蚂蚁s.java @describe:
 */
public class 兰顿蚂蚁s {

	// 分别表示上左下右
	static int WSAD[][] = { { -1, 0 }, { 0, 1 }, { 1, 0 }, { 0, -1 } };
	static int cur;
	static int x, y, k;
	static char s;

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int arr[][] = new int[n][m];

		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				arr[i][j] = sc.nextInt();
			}
		}
		x = sc.nextInt();
		y = sc.nextInt();
		s = sc.next().charAt(0);
		k = sc.nextInt();
		fun(arr);
		System.out.println(x + " " + y);

	}

	public static void fun(int arr[][]) {
		switch (s) {
		case 'U':
			cur = 0;
			break;
		case 'D':
			cur = 2;
			break;
		case 'L':
			cur = 3;
			break;
		case 'R':
			cur = 1;
			break;
		}
		for (int i = 0; i < k; i++) {
			if (arr[x][y] != 0) {
				arr[x][y] = 0;
				cur = (cur + 1) % 4;
				x += WSAD[cur][0];
				y += WSAD[cur][1];
			} else {
				arr[x][y] = 1;
				// +4为了考虑cur为0时的情况,所以先加4在-1
				cur = (cur + 4 - 1) % 4;
				x += WSAD[cur][0];
				y += WSAD[cur][1];
			}
		}
	}
}


奇怪的分式

上小学的时候,小明经常自己发明新算法。一次,老师出的题目是:

1/4 乘以 8/5

小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png)

老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼!

对于分子、分母都是 1~9 中的一位数的情况,还有哪些算式可以这样计算呢?

请写出所有不同算式的个数(包括题中举例的)。

显然,交换分子分母后,例如:4/1 乘以 5/8 是满足要求的,这算做不同的算式。

但对于分子分母相同的情况,2/2 乘以 3/3 这样的类型太多了,不在计数之列!

/**
 * @createDate:2019年3月14日 下午2:56:30
 * @porjectName:lanqiao
 * @author Static
 * @version 1.0
 * @since JDK 1.8.0_21
 * @filename:奇怪的分式s.java @describe:
 */
public class 奇怪的分式s {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int top;
		int butt;
		int count = 0;
		for (int a = 1; a <= 9; a++) {
			for (int b = 1; b <= 9; b++) {
				if (a != b)
					for (int c = 1; c <= 9; c++) {
						for (int d = 1; d <= 9; d++) {
							if (c != d) {
								top = a * 10 + c;
								butt = b * 10 + d;
								if (a * c * butt == b * d * top)
									count++;
							}
						}
					}
			}
		}
		System.out.println(count);
	}
}

 


李白打酒

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

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

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

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

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

/**
 * @createDate:2019年3月14日 下午3:24:55
 * @porjectName:lanqiao
 * @author Static
 * @version 1.0
 * @since JDK 1.8.0_21
 * @filename:李白打酒s.java @describe:
 */
public class 李白打酒s {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(fun(5, 10, 2));
	}

	public static int fun(int a, int b, int sum) {
		if (a < 0 || b < 0)
			return 0;
		if (a == 0 && b == 1 && sum == 1)
			return 1;
		return fun(a - 1, b, sum * 2) + fun(a, b - 1, sum - 1);
	}
}


写日志

写日志是程序的常见任务。现在要求在 t1.log, t2.log, t3.log 三个文件间轮流
写入日志。也就是说第一次写入t1.log,第二次写入t2.log,... 第四次仍然
写入t1.log,如此反复。

下面的代码模拟了这种轮流写入不同日志文件的逻辑。

public class A {
    private static int n = 1;

    public static void write(String msg) {
        String filename = "t" + n + ".log";
        n = ____________;
        System.out.println("write to file: " + filename + " " + msg);
    }
}

class A {
	private static int n = 1;

	public static void write(String msg) {
		String filename = "t" + n + ".log";
		n = n % 3 + 1;
		System.out.println("write to file: " + filename + " " + msg);
	}
}

大衍数列

中国古代文献中,曾记载过“大衍数列”, 主要用于解释中国传统文化中的太极衍生原理。

它的前几项是:0、2、4、8、12、18、24、32、40、50 ...

其规律是:对偶数项,是序号平方再除2,奇数项,是序号平方减1再除2。

以下的代码打印出了大衍数列的前 100 项。

for (int i = 1; i < 100; i++) {
            if (________________) // 填空
                System.out.println(i * i / 2);
            else
                System.out.println((i * i - 1) / 2);
        }

请填写划线部分缺失的代码。通过浏览器提交答案。

/**
 * @createDate:2019年3月14日 下午7:02:33
 * @porjectName:lanqiao
 * @author Static
 * @version 1.0
 * @since JDK 1.8.0_21
 * @filename:大衍数列.java @describe:
 */
public class 大衍数列 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		for (int i = 1; i < 100; i++) {
			if (i % 2 == 0) // 填空
				System.out.println(i * i / 2);
			else
				System.out.println((i * i - 1) / 2);
		}
	}
}

猜字母

把abcd...s共19个字母组成的序列重复拼接106次,得到长度为2014的串。

接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的
字母。

得到的新串再进行删除奇数位置字母的动作。如此下去,最后只剩下一个字母,
请写出该字母。

import java.util.ArrayList;
import java.util.List;

/**
 * @createDate:2019年3月14日 下午7:11:37
 * @porjectName:lanqiao
 * @author Static
 * @version 1.0
 * @since JDK 1.8.0_21
 * @filename:猜字母.java @describe:
 */
public class 猜字母 {

	static char arr[] = new char[2014];
	static String str = "abcdefghijklmnopqrs";
	static List<Character> list = new ArrayList<Character>();

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		for (int i = 0; i < 2014; i++) {
			list.add(str.charAt(i % 19));
		}
		fun();
		System.out.println(list.get(0));
	}

	public static void fun() {
		if (list.size() > 1) {
			// 从后往前删除,因为从前往后删除第一个后,后面的索引全部都会向前移动
			for (int i = list.size() - 1; i >= 0; i--) {
				if (i % 2 == 0)
					list.remove(i);
			}
			fun();
		}
	}
}


等额本金

小明从银行贷款3万元。约定分24个月,以等额本金方式还款。

这种还款方式就是把贷款额度等分到24个月。每个月除了要还固定的本金外,
还要还贷款余额在一个月中产生的利息。

假设月利率是:0.005,即:千分之五。那么,

第一个月,小明要还本金 1250, 还要还利息:30000 * 0.005,总计 1400
第二个月,本金仍然要还 1250, 但利息为:(30000-1250) * 0.005 总计 1393.75

请问:小明在第15个月,应该还款多少(本金和利息的总和)?

/**
 * @createDate:2019年3月14日 下午8:45:09
 * @porjectName:lanqiao
 * @author Static
 * @version 1.0
 * @since JDK 1.8.0_21
 * @filename:等额本金.java @describe:
 */
public class 等额本金 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println((30000 - 14 * 1250) * 0.005 + 1250);
	}
}


猜年龄

小明带两个妹妹参加元宵灯会。别人问她们多大了,她们调皮地说:“我们俩的年龄
之积是年龄之和的6倍”。小明又补充说:“她们可不是双胞胎,年龄差肯定也不超过
8岁啊。”

请你写出:小明的较小的妹妹的年龄。

/**
 * @createDate:2019年3月14日 下午8:51:37
 * @porjectName:lanqiao
 * @author Static
 * @version 1.0
 * @since JDK 1.8.0_21
 * @filename:猜年龄_xiaom.java @describe:
 */
public class 猜年龄_xiaom {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		for (int i = 1; i < 20; i++) {
			for (int j = 1; j < 20; j++) {
				if (i * j == 6 * (i + j) && Math.abs(i - j) <= 8 && i != j) {
					System.out.println(i + " " + j);
				}
			}
		}
	}
}

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值