蓝桥杯-15:考前真题讲解
真题1-约数个数

对于一个整数,能整出这个整数的数成为这个数的约数
例如:1,2,3,6都是6的约数
请问78120有多少个约数?
讲解

int一个n等于78120,再int一个sum来计数,初始化为0;
int n = 78120;
int sum = 0;
写一个for循环,因数包括本身 所以循环范围:i<=78120,再写入一个if判断,能被n整除的数都是n的因数,即n取模i等于0;如果是,则累加sum;
for (int i = 1; i <= 78120; i++) {
//能被n整除的数都是n的因数
if (n%i == 0) {
sum++;
}
最后输出sum(78120的因数个数)。
System.out.println(sum);
结果如下图所示:


真题2-找2020

小兰有一个数字矩阵,里面只含数字0和2,小蓝很喜欢2020,他想找到这个数字矩阵中有多少个2020。
小兰只关注三种后构成2020的方式:
1.同一行里面连续四个数字从左到右构成2020
2.同一列里面连续四个数字从上到下构成202
3.在一条从左上到右下的斜线上连续四个字符,从左上到右下构成2020
讲解

首先写一个char类型的二维数组来接受这个只含0和2的数字矩阵,并进行初始化;
int一个m和一个n分别接收数字矩阵的行长和列长,再int一个sum来计数,初始化为0,接收2020的个数;
char[][] twos = {
{'2','2','0','2','0','2'},
{'0','0','2','0','2','0'},
{'2','2','2','0','2','2'},
{'0','0','2','0','0','0'}
};
//行的长度和列的长度
int m = twos.length;
int n = twos[0].length;
//sum计数
int sum = 0;

写一个双重循环,用来遍历数组里的字符,写入三个if判断,分别从行、列和斜向来找2020;都需写入边界判断,以及该方向的四个位置上的字符是否为2020;是则累加sum;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
//横向2020 判断越界及值
if ((i+3 <= m-1) && (twos[i][j] == '2') && (twos[i+1][j] == '0')&& (twos[i+2][j] == '2')&& (twos[i+3][j] == '0')) {
sum++;
}
//竖向2020
if ((j+3 <= n-1) && (twos[i][j] == '2') && (twos[i][j+1] == '0')&& (twos[i][j+2] == '2')&& (twos[i][j+3] == '0')) {
sum++;
}
//斜向2020
if ((i+3 <= m-1) && (j+3 <= n-1) && (twos[i][j] == '2') && (twos[i+1][j+1] == '0') && (twos[i+2][j+2] == '2') && (twos[i+3][j+3] == '0')) {
sum++;
}
}
}
最后输出sum(2020的个数)。
System.out.println(sum);
结果如下图所示:


真题3-跑步锻炼

小蓝每天都跑步锻炼身体,正常情况下,小蓝每天跑步1千米;如果某天是周一或月初(1日),为了激励自己,小蓝要跑2千米;如果同时是周一和月初,小蓝也是跑2千米;小蓝跑步已经坚持了很长时间,从2000你拿1月1日周六(含)到2020年10月1日周四(含)。
请问这段时间小蓝总共跑了多少千米?
讲解

这里可以用到一个类——Calendar,可以自动识别日期,其中的set方法,可以设置日期,add增加,get获取;
首先,写入类,并初始化时间格式;再用set依次设置开始时间的年月日;int一个sum用来计数,初始化为2,因为起始时间的那天也包含在内,并且是月初,要跑2千米;
// Calendar类 初始化时间格式
Calendar cl =Calendar.getInstance();
//set——设置日期
cl.set(Calendar.YEAR, 2000);
//Calendar类中的月份从0开始
cl.set(Calendar.MONTH, 0);
cl.set(Calendar.DAY_OF_MONTH, 1);
//起始时间2020.1.1页包含在内
//这天是月初 2km 初始化sum等于2
int sum = 2;

再写一个while循环,用add增加月份的天为1,以便日期递增,再int一个week和一个day;
写一个if判断,判断是否为最后一天,是则判断是否为周一或月初,再按题意累加跳出循环;不是当天则判断是否为周一或月初,按题意累加到sum,继续循环;
if (cl.get(Calendar.YEAR) == 2020 && cl.get(Calendar.MONTH) == 9 && day == 1 ) {
if (day == 1 || week ==1) {
sum+=2;
}else {
sum++;
}
break;
}else {
if (day == 1 || week ==1) {
sum+=2;
}else {
sum++;
}
}
}
最后输出sum(跑步千米数)。
System.out.println(sum);
真题4-平面分割

20个圆和20条直线最多能把平面分成多少部分?
讲解

这一题可以用画图来理解,一个圆时会将平面分成两个部分;int一个 ans 来接收平面个数,初始化为2;


两个圆时有四个平面,三个圆时有六个平面,以此推出:ans += (i - 1) * 2;


//一个圆时会将平面分成两个部分
int ans = 2;
for (int i = 2; i <= 20; i++) {
//两个圆时有四个平面 三个圆时有六个平面
//以此推出
ans += (i - 1) * 2;
}

第一条直线裂开 平面翻倍;ans重新赋值,为第一根直线进入后的平面数;

加入直线后,会发现有几条直线就会裂开几次,裂开一次平面翻倍;以此推出:ans += (20 * 2) + i;


//第一条直线裂开 平面翻倍
ans += 20*2;
for (int i = 2; i <= 20; i++) {
//几条直线就会裂开几次
//裂开一次平面数量翻倍
ans += (20 * 2) + i;
}
最后输出ans(平面数)。
System.out.println(ans);
结果如下图所示:



除此之外,还有一种方法,直接使用圆和直线的空间分割公式:m^2 + n^2/2 + 2mn - m + 2/n +1(m代表圆,n代表直线);直接输出结果(平面数)。
//公式
//圆和直线的空间分割公式 m,n
//m^2 + n^2/2 + 2mn - m + 2/n +1
System.out.println(20*20+0.5*20*20+2*20*20-20+0.5*20+1);
结果如下图所示:


添加 家长论坛微信
全部 0条评论