12届蓝桥杯javab组真题
A,ASC
签到题
package train;
public class test_5 {
public static void main(String[] args){
System.out.println('L'+0);
}
}
B,卡片
此题刚开始以为要用到10个循环各个都循环一遍,但是最后观察到,他们拼成的数必须是连续的,所以只需要判断1这个数的2021个用完没有如果用完了,那么就算其他的数的卡片有剩余也没有什么用,而且我们可以观察到,拼成1-10就总共拼成了十个数,所以能拼成几个数,就是拼成的最大数字,所以当1拼最后的那个数时就是最终答案
package train;
public class test_6 {
public static void main(String [] args){
int k=0;
for(int i=1;i<20210;i++){
String str=i+"";
for(int j=0;j<str.length();j++){
if(str.charAt(j)=='1')
k++;
}
if(k==2021) {
System.out.println(str);
break;
}
if(k>2021){
System.out.println(Integer.parseint(str)-1);
break;//需要加一个特判,有一用不完的情况,
}
}
}
}
C,直线
此题利用Arrylist和Hashset来解出
其中Arrylist来储存所有的点,Hashset来去重,因为Hashset其中的特点有不储存重复的元素,所以计算出斜率和截距,化为最简储存之后在输出size就是能构造多少条直线了
package train;
import java.util.ArrayList;
import java.util.HashSet;
public class test_7 {
public static int gcd(int m,int n){
return n==0?m:gcd(n,m%n);
}
public static void main(String[] args)
{
ArrayList<Integer> list=new ArrayList<Integer>();
for(int i=0;i<=19;i++)
for(int j=0;j<=20;j++)
list.add(i*100+j);
HashSet<String> set=new HashSet<String>();
for(int i=0;i<list.size();i++){
int a=list.get(i);
for(int j=i+1;j<list.size();j++){
int b=list.get(j);
int x=a/100;
int y=a%100;
int x1=b/100;
int y1=b%100;
int down=x1-x;
int up=y1-y;
int gcd=gcd(down,up);
String s=(up/gcd)+"/"+(down/gcd);//求出斜率以分数形式求出最简
//特判一个竖线的情况
if(down==0){
set.add("x=="+x);
continue;
}
//计算截距
//因为必须是分数形式为了避免小数,所以必须吧截距写为分数形式,
int down1=y*down;
int up1=x*up;
int up2=down1-up1;
int gcd1=gcd(up2,down);
String s1=(up2/gcd1)+"/"+(down/gcd1);
set.add(s+" "+s1);
}
}
System.out.println(set.size());
}
}
D,货物摆放
此题说实话在处理因子的时候发现超时实在太严重了,最后在csdn发现大佬的大数求因子的方法,才解出,其他的思路很简单
链接:csdn
package train;
import java.util.ArrayList;
public class test_8 {
public static void main(String[] args){
long n=2021041820210418l;
ArrayList<Long>a=new ArrayList<Long>();
//不知道因子有多少个,所以定义一个不知长度的数组
long nn=1;
int k=0;
for(long i=1;i<Math.sqrt(n);i++){
if(n%i==0) {
a.add(i);
a.add(n/i);
}
}
//求一个很大数的因子的方法
int res=0;
for(int i=0;i<a.size();i++)
for(int j=0;j<a.size();j++)
for(int l=0;l<a.size();l++){
if(a.get(i)*a.get(j)*a.get(l)==n)
res++;
}
System.out.println(res);
}
}
F,时间显示
此题,第一次竟然没过,最后发现hours/60,最后改成24,过了,对24取余取出多余的时间
package train;
import java.util.Scanner;
public class test_9 {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
long a=sc.nextLong();
long alls=a/1000;//总共的秒数
long s=alls%60;
long allm=alls/60;//总共的分钟
long m=allm%60;
long allh=allm/60;
long h=allh%24;
System.out.println(String.format("%02d:%02d:%02d",h,m,s));
}
}
G,最少砝码
找规律的题,起初看的时候一点思路都没有,但是吧法玛组列出来,最后发现,只要输入的n小于砝码的重量和就可以称出来,而且砝码组也有自己的最优
砝码数: | 1 | 2 | 3 | 4 |
---|---|---|---|---|
砝码组: | 1 | 1,3 | 1,3,9 | 1,3,9,27 |
就可以发现,砝码组的和=砝码组上一组的重量和*3+1,
下一组砝码组的新增砝码=上一组最后的砝码*3;
package train;
import java.util.Scanner;
public class test_10 {
public static void main(String [] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int k=1,total=1;
while(total<n){
total=total*3+1;
k++;
}
System.out.println(k);
}
}