A.[蓝桥杯 2021 省 B2] 特殊年份
题目:
今年是 2021 年,2021 这个数字非常特殊, 它的千位和十位相等, 个位比百位大 1,我们称满足这样条件的年份为特殊年份。
输入 5 个年份,请计算这里面有多少个特殊年份。
思路:
将每一位拿出来判断就可以了。
代码:
点击查看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] arr = new int[5];
for(int i = 0;i < 5;i++) {
arr[i] = scanner.nextInt();
}
int count = 0;
for(int i = 0;i < 5;i++) {
int a = arr[i]/1000;
int b = arr[i]%1000/100;
int c = arr[i]%100/10;
int d = arr[i]%10;
if(a == c&&b+1==d) {
count++;
}
}
System.out.println(count);
}
}
B.[蓝桥杯 2021 省 AB2] 小平方
题目:
小蓝发现,对于一个正整数 n 和一个小于 n 的正整数 v,将 v 平方后对 n 取余可能小于 n 的一半,也可能大于等于 n 的一半。
请问,在 1 到 n−1 中, 有多少个数平方后除以 n 的余数小于 n 的一半。
例如,当 n=4 时,1,2,3 的平方除以 4 的余数都小于 4 的一半。
又如,当 n=5 时, 1,4 的平方除以 5 的余数都是 1,小于 5 的一半。而 2,3 的平方除以 5 的余数都是 4, 大于等于 5 的一半。
思路:
从1开始到n-1,判断每个数的平方取余乘 2 后是不是小于n的就行。这里用乘法比用除法更好,不然可能在边界会出现一些问题。
代码:
点击查看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int count = 0;
for(int i = 1;i < n;i++) {
int m = i*i;
if((m%n)*2<n) {
count++;
System.out.println(i);
}
}
System.out.println(count);
}
}
C.[蓝桥杯 2021 省 AB2] 完全平方数
题目:
一个整数 a 是一个完全平方数,是指它是某一个整数的平方,即存在一个 整数 b,使得 a=b^2。
给定一个正整数 n,请找到最小的正整数 x,使得它们的乘积是一个完全平方数。
例如:12 得到的结果就是3。因为12*3=36,36是6的平方,3是最小的能够使12乘上它后得到完全平方数。
思路:
输入这个数后首先判断一下这个数是不是质数,如果是质数的话就那么最小就是这个数本身符合条件,因为我们要找到最小的符合条件的数,就要拆分出这个数的因子,比如12=223,这个里面就有2的平方,那么如果再乘上一个3,那不就是一个完全平方数嘛,是质数的话就不能找到一个数的平方乘某个数的这种形式。
如果不是质数的话,就用变量i从这个数的平方根到1开始遍历,因为我们要找到这个数就要找到(ii)j的这种形式,ii最大的时候得到的j就最小,所以我们的i就从最大遍历到最小,一旦n取ii的模为0,也就是刚好除尽,就找到了这个数,并且还是最小的。
代码:
点击查看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
long n = scanner.nextLong();
boolean flag = true;
for(int i = 2;i < Math.sqrt(n);i++) {
if(n%i==0) {
flag = false;
break;
}
}
if(flag) {
System.out.println(n);
}else {
for(long i = (long) Math.sqrt(n);i>1;i--) {
if(n%(i*i)==0) {
long m = n/(i*i);
System.out.println(m);
return;
}
}
System.out.println(n);
}
}
}
D.[蓝桥杯 2021 省 B] 时间显示
题目:
小蓝要和朋友合作开发一个时间显示的网站。在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从 1970 年 1 月 1 日 00:00:00 到当前时刻经过的毫秒数。
现在,小蓝要在客户端显示出这个时间。小蓝不用显示出年月日,只需要 显示出时分秒即可,毫秒也不用显示,直接舍去即可。
给定一个用整数表示的时间,请将这个时间对应的时分秒输出。
思路:
注意这里输入的是毫秒数,需要先转化为秒再进行计算。这里是不需要考虑有多少天的,因为只需要找到最后一天即可,直接对一天的秒数(86400)取模,就可以得到最后一天的多少秒。最开始就是因为考虑的天数,考虑了闰年什么的,将问题想复杂了。
代码:
点击查看代码
import java.util.Scanner;
public class MainE {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
long n = scanner.nextLong();
n/=1000; //输入的是毫秒,结果要的是时分秒,1s = 1000ms
n%=86400; //不需要关心闰年什么的,天数是不需要关心的
long h = n/3600;
n %= 3600;
long m = n/60;
long s = n%60;
System.out.printf("%02d:%02d:%02d\n",h,m,s);
}
}
E.[蓝桥杯 2021 省 B] 杨辉三角形
题目:
下面的图形是著名的杨辉三角形:
如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列:
1,1,1,1,2,1,1,3,3,1,1,4,6,4,1…
给定一个正整数 N,请你输出数列中第一次出现 N 是在第几个数。
思路:
首先得到这个杨辉三角,然后再遍历,找到第一次出现的地方,将下标记下来,然后按照规律算出是第几个数。
代码:
点击查看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
long n = scanner.nextLong();
if(n==1) {
System.out.println(1);
return;
}
int[][] yangHui = new int[20000][];
int goali = 0,goalj = 0;
for (int i = 0;i < yangHui.length;i++) {
yangHui[i] = new int[i+1];
yangHui[i][0]=yangHui[i][i]=1;
for(int j = 1;j < yangHui[i].length-1;j++) {
yangHui[i][j] = yangHui[i-1][j-1] + yangHui[i-1][j];
if(yangHui[i][j]==n) {
goali = i+1;
goalj = j+1;
int count = 0;
for(int x = 1;x<=goali-1;x++) {
for(int y = 1;y<=x;y++) {
count++;
}
}
count+=goalj;
System.out.println(count);
return;
}
}
}
}
}