第六届蓝桥杯大赛个人赛省赛(软件类)Java 大学A组

1.
熊怪吃核桃
森林里有一只熊怪,很爱吃核桃。不过它有个习惯,每次都把找到的核桃分成相等的两份,吃掉一份,留一份。如果不能等分,熊怪就会扔掉一个核桃再分。第二天再继续这个过程,直到最后剩一个核桃了,直接丢掉。
有一天,熊怪发现了1543个核桃,请问,它在吃这些核桃的过程中,一共要丢掉多少个核桃。

请填写该数字(一个整数),不要填写任何多余的内容或说明文字。

public class Main {
	public static void main(String[] args){	
		int n=1543;
		int count=0;
		while(n>0){
			if(n%2==1){
				count++;
				n=n-1;
				n=n/2;
			}
			else{
				n=n/2;
			}
		}
		System.out.println(count);	
	}
}

答案:5


2.
星系炸弹
在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。
每个炸弹都可以设定多少天之后爆炸。
比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。
有一个贝塔炸弹,2014年11月9日放置,定时为1000天,请你计算它爆炸的准确日期。
请填写该日期,格式为 yyyy-mm-dd  即4位年份2位月份2位日期。比如:2015-02-19
请严格按照格式书写。不能出现其它文字或符号。

public class Main1 {
    public static void main(String[] args){
        
        int year=2014;
        int month=11;
        int day=9;        
        int count=1000;
        count=count+day;
        boolean flag=false;
    
        int a[][]= {
                {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
                {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
                };        
        while(count>31){
//            month++;
            if(month>12){
                month=1;
                year++;
            }
            flag= (year%4 == 0 && year%100 != 0) || year%400 == 0;
            if(flag){
                count=count-a[1][month];    
                month++;
            }
            else {
                count=count-a[0][month];
                month++;
            }
//            避免出现2月30号的情况
            if(flag==true&&month==2&&count==30){
                month++;
                count-=29;
            }
            if(flag==false&&month==2&&(count==29||count==30)){
                month++;
                count-=28;
            }
        }
        
        
        day=count;
//        year=String.format("%02d",year);
        System.out.println(year+"-"+String.format("%02d",month)+"-"+String.format("%02d",day));
        
    }

}


答案:2017-08-05


3.
九数分三组
1~9的数字可以组成3个3位数,设为:A,B,C,  现在要求满足如下关系:
B = 2 * A
C = 3 * A
请你写出A的所有可能答案,数字间用空格分开,数字按升序排列。
注意:只提交A的值,严格按照格式要求输出。

public class Main3 {
    public static void main(String[] args){            
        int a[]={0,0,0,0,0,0,0,0,0};
        int temp;
        int count=0;
        int A,B,C;
        boolean b[]={true,true,true,true,true,true,true,true,true,true};
        for(int a1=1;a1<=3;a1++){
            b[a1]=false;
            for(int a2=1;a2<=9;a2++){                
                if(b[a2]!=false){
                    b[a2]=false;
                    for(int a3=1;a3<=9;a3++){                        
                        if(b[a3]!=false){    
                            A=a1*100+a2*10+a3;
                            if(A<=333){                                                        
                            B=2*A;
                            C=3*A;

                            a[0]=A/100;
                            temp=A-a[0]*100;
                            a[1]=temp/10;
                            a[2]=A%10;
                            
                            a[3]=B/100;
                            temp=B-a[3]*100;
                            a[4]=temp/10;
                            a[5]=B%10;
                            
                            a[6]=C/100;
                            temp=C-a[6]*100;
                            a[7]=temp/10;
                            a[8]=C%10;

                            
                            for(int i=0;i<=7;i++){
                                for(int j=i+1;j<=8;j++){
                                    if(a[i]==a[j]||a[i]==0||a[j]==0){
                                        i=8;                                        
                                    }
                                    if(i==7&&j==8&&a[7]!=a[8]&&a[7]!=0&&a[8]!=0){
                                        System.out.print(A);
                                        System.out.print(' ');
                                    }
                                }
                            }                            
                            count++;    
                            }                        
                                        
                        }    
                                            
                    }    
                    b[a2]=true;
                                }                
                }
            b[a1]=true;            
            }
        //System.out.println(count);
        
        
    }
    
    
}



答案: 192 219 273 327



4.

循环节长度
两个整数做除法,有时会产生循环小数,其循环部分称为:循环节。
比如,11/13=6=>0.846153846153.....  其循环节为[846153] 共有6位。
下面的方法,可以求出循环节的长度。
请仔细阅读代码,并填写划线部分缺少的代码。
public static int f(int n, int m)
{
n = n % m;
Vector v = new Vector();
for(;;)
{
v.add(n);
n *= 10;
n = n % m;
if(n==0) return 0;
if(v.indexOf(n)>=0)  _________________________________ ;  //填空
}
}
注意,只能填写缺少的部分,不要重复抄写已有代码。不要填写任何多余的文字。

//循环节长度
import java.util.Vector;

public class Main4{

    public static void main(String[] args) {
        System.out.println(f(11, 13));
    }

    public static int f(int n, int m) {
        n = n % m;
        Vector v = new Vector();
        for (;;) {
            //把每次的余数添加进Vector
            v.add(n);
//            System.out.println(n);
            //余数乘10,想想自己做除法时的步骤
            n *= 10;
            n = n % m;
            if (n == 0)
                return 0;
            //当余数n和队列里的某个余数一样说明开始循环了
            if (v.indexOf(n) >= 0)
                return v.size() - v.indexOf(n);
        }
    }

}

答案: return v.size() - v.indexOf(n);



5.

打印菱形
给出菱形的边长,在控制台上打印出一个菱形来。
为了便于比对空格,我们把空格用句点代替。
当边长为8时,菱形为:
.......*
......*.*
.....*...*
....*.....*
...*.......*
..*.........*
.*...........*
*.............*
.*...........*
..*.........*
...*.......*
....*.....*
.....*...*
......*.*
.......*

下面的程序实现了这个功能,但想法有点奇怪。
请仔细分析代码,并填写划线部分缺失的代码。
public class A
{
public static void f(int n)
{
String s = "*";
for(int i=0; i<2*n-3; i++) s += ".";
s += "*";
String s1 = s + "\n";
String s2 = "";
for(int i=0; i//System.out.println("=>"+s);
s = "." + _____________________________________ + "*";  //填空
s1 = s + "\n" + s1;
s2 += s + "\n";
}
System.out.println(s1+s2);
}
public static void main(String[] args)
{
f(8);
}
}
注意,只能填写缺少的部分,不要重复抄写已有代码。不要填写任何多余的文字。

public class Main5 {
	
	
	public static void f(int n)
	{
		String s = "*";
		for(int i=0; i<2*n-3; i++) s += ".";
		s += "*";
	
		String s1 = s + "\n";
		String s2 = "";
		
		for(int i=0; i"+s);
			s = "." +s1.substring(0, 2*n - 4 - i)+ "*";  
			s1 = s + "\n" + s1;
			s2 += s + "\n";
		}
		System.out.println(s1+s2);		
	}
	
	public static void main(String[] args)
	{
		f(8);
	}

}


答案:s1.substring(0, 2*n - 4 - i)


6.

加法变乘法
我们都知道:1+2+3+ ... + 49 = 1225
现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015
比如:
1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015
就是符合要求的答案。
请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。
注意:需要你提交的是一个整数,不要填写任何多余的内容。

public class Main6 {

	public static void main(String[] args){
		
		for(int a=1;a<=48;a++){
			for(int b=1;b<=48;b++){
//				if(Math.abs(b-a)<=1);
				if(Math.abs(b-a)>1){
					int sum=0;
					for(int i=1;i<=49;i++){
						if(i==a||i==b){							
						}
						if(i==a+1||i==b+1){
							sum=sum+i*(i-1);
						}
						if(i!=a&&i!=b&&i!=b+1&&i!=a+1) sum=sum+i;												
				}
				if(sum==2015){
					System.out.println(a);					
				}
				
			}
		}				
								
		}
			
	}
}
答案:10

(靠前的那个数可取值有10,16,24,27)

7.
牌型种数
小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
请填写该整数,不要填写任何多余的内容或说明文字。

public class Main7 {
	public static void main(String[] args){
		int count=0;
		for(int a1=0;a1<=4;a1++){
			for(int a2=0;a2<=4;a2++){
				for(int a3=0;a3<=4;a3++){
					for(int a4=0;a4<=4;a4++){
						for(int a5=0;a5<=4;a5++){
							for(int a6=0;a6<=4;a6++){
								for(int a7=0;a7<=4;a7++){
									for(int a8=0;a8<=4;a8++){
										for(int a9=0;a9<=4;a9++){
											for(int a10=0;a10<=4;a10++){
												for(int a11=0;a11<=4;a11++){
													for(int a12=0;a12<=4;a12++){
														for(int a13=0;a13<=4;a13++){
															int sum=a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13;
															if(sum==13) count++;
														}
													}
												}
											}
											
										}
									}
								}
							}
						}
					}
				}
			}
		}
		System.out.println(count);
		
	}
}

8.
移动距离
X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3...
当排满一行时,从下一行相邻的楼往反方向排号。
比如:当小区排号宽度为6时,开始情形如下:
1  2  3  4  5  6
12 11 10 9  8  7
13 14 15 .....
我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离(不能斜线方向移动)
输入为3个整数w m n,空格分开,都在1到10000范围内
w为排号宽度,m,n为待计算的楼号。
要求输出一个整数,表示m n 两楼间最短移动距离。
例如:
用户输入:
6 8 2
则,程序应该输出:
4
再例如:
用户输入:
4 7 20
则,程序应该输出:
5
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。

import java.util.Scanner;


public class Main8 {
	public static void main(String[] args){
			
			Scanner in=new Scanner(System.in);
			int w=in.nextInt();
			int m=in.nextInt();
			int n=in.nextInt();
			int m1=(m-1)/w+1;//行号
			int m2=0;//列号
			if(m1%2==1) m2=m%w;
			if(m1%2==0) m2=w-m%w+1;
			
			int n1=(n-1)/w+1;
			int n2=0;
			if(n1%2==1) n2=n%w;
			if(n1%2==0) n2=w-n%w+1;
			
			System.out.println(Math.abs(m1-n1)+Math.abs(m2-n2));							
	}
	
	
}








      




你可能感兴趣的:(蓝桥杯)