第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);
}
}
}
}
}