第六届蓝桥杯java省赛大学生C组

第六届蓝桥杯java省赛大学生C组,第1张

A.隔行变色

Excel表的格子很多,为了避免把某行的数据和相邻行混淆,可以采用隔行变色的样式.小明设计的样式为:第1行蓝色,第2行白色,第3行蓝色,第4行白色,....
现在小明想知道,从第21行到第50行一共包含了多少个蓝色的行.
请你直接提交这个整数,千万不要填写任何多余的内容.

参考代码

//蓝白蓝白
//第21行到第50行  有几行蓝色


public class 隔行变色 {
	    public static void main(String[] args) {
	          int h = 0;
	          for(int i = 21; i <= 50; i++ ) {
	              if(i % 2 != 0) {
	                 
	            	  h++;
	              }
	        }
	          System.out.println(h);
	   
	    }
	}

B.立方尾不变

有些数字的立方的末尾正好是该数字本身.比如: 1,4,5,6,9,24,25....
请你计算一下,在10000以内的数字中(指该数字,并非它立方后的数值),符合这个特征的正整数一共有多少个.
请提交该整数,不要填写任何多余的内容.

参考代码



	//import java.util.Scanner;
	

	//public class 立方尾不变 {
	 /*   public static void main(String[] args) {
	        int count=0;
	        for (int i = 1; i <= 10000; i++) {
	          if(i<10){
	            if((i*i*i)%10==i){
	              count++;
	            }
	          }else if(i<100){
	            if((i*i*i)%100==i){
	              count++;
	            }
	          }else if(i<1000){
	            if((i*i*i)%1000==i){
	              count++;
	            }
	          }else if(i<10000){
	            if((i*i*i)%10000==i){
	              count++;
	            }
	          }
	        }
	        System.out.println(count);
	    }*/
		import java.math.BigInteger;
		public class 立方尾不变 {
		 public static void main(String[] args) {
		      int count=0;
		        for(int i=1;i<=10000;i++) {
		            String str=String.valueOf(i);
		            double b=Math.pow(10,str.length());
	          int a=(int) ((((i * i) % b)* i)% b);     
		       // int a=(int) ((i*i*i)%b);      //精度缺失
		        if(i==a) {
		           count++;
		           }
		       }
		        System.out.println(count);     //36
		 }

		}
	

C.无穷分数

无穷的分数,有时会趋向于固定的数字.
请计算【图 1.jpg】所示的无穷分数,要求四舍五入,精确到小数点后5位,小数位不足的补0.
请填写该浮点数,不能填写任何多余的内容.

 

参考代码




public class 无穷分数 {
    public static void main(String[] args) {
    	
        System.out.printf("%.5f",f(1));
        
        
    }
    
    public static double f(int n){
        if (n==999999){
        	
            return 1;
        }
        return n/(n+f(n+1));
    }
}
D.循环节长度

两个整数做除法,有时会产生循环小数,其循环部分称为:循环节.比如,11/13=6=>0.846153846153..其循环节为[846153]共有6位.下面的方法,可以求出循环节的长度.
 

参考代码
import java.util.*;
public class Main
{
    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){
              return v.size()-v.indexOf(n);
            };
        }
    }    
    public static void main(String[] args)
    {
        System.out.println(f(1, 8));
        System.out.println(f(8, 3));
        System.out.println(f(11, 13));
        System.out.println(f(39, 190));
    }
}
E.格子中输出

stringInGrid方法会在一个指定大小的格子中打印指定的字符串.要求字符串在水平、垂直两个方向上都居中.
如果字符串太长,就截断.
如果不能恰好居中,可以稍稍偏左或者偏上一点.

 

参考代码  
public class Main {
  public static void main(String[] args) {
    stringInGrid(20, 6, "abcd1234");

  }

  public static void stringInGrid(int width, int height, String s)
  {
    if(s.length()>width-2) s = s.substring(0,width-2);
      System.out.print("+");
    for(int i=0;i
F.奇妙的数字

小明发现了一个奇妙的数字.它的平方和立方正好把0~9的10个数字每个用且只用了一次.你能猜出这个数字是多少吗?
 

参考代码  
import java.util.*;


public class Main {
    public static void main(String[] args) {
        for (int i = 1;i<100 ; i++) {
            int a=i*i;
            int b=i*i*i;
            String cString=a+""+b;
            if (Jc(cString)) {
                System.out.println(i);
                break;
            }
        }
    }
    public static boolean Jc(String num) {
        char[] clist=num.toCharArray();
        Arrays.sort(clist);
        num=String.valueOf(clist);
        if (num.equals("0123456789")) {
            return true;
        }
        return false;
    }
}
G.加法变乘法

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

参考代码  
public static void main(String [] args) {
		for(int i=1; i<=49; i++) {
			int a = i;
			for(int j=i+2 ; j<=49; j++) {
				int b = j;
				if(a*a-a+b*b-b==792 && a!=10) {
					System.out.println(a);
				}
			}
			
		}
	}
H.移动距离

星球居民小区的楼房全是一样的,并且按矩阵样式排列.其楼房的编号为1,2,3...当排满一行时,从下一行相邻的楼往反方向排号.
比如:当小区排号宽度为6时,开始情形如下:
12 3 4 5 6
1211 109 8 713 14 15......
我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离(不能斜线方向移动)
输入为3个整数w m n,空格分开,都在1到10000范围内要求输出一个整数,表示m n两楼间最短移动距离.
例如:
用户输入:6 8 2
则,程序应该输出:4
 

参考代码  

//w   号码间的宽度   

	import java.util.Scanner;
	
	public class 移动距离 {
	    public static void main(String[] args) {
	             Scanner sc=new Scanner(System.in);
	        int w=sc.nextInt();
	        int m=sc.nextInt();
	        int n=sc.nextInt();
	        
	        int a=m / w;
	        int b=m %  w;if(b==0)a-=1;
	        if(a%2==0)b-=1;
	        if(a%2==1)b=w-b;
	        int a1=n/w;
	        int b1=n%w;if(b1==0)a1-=1;
	        if(a1%2==0)b1-=1;
	        if(a1%2==1)b1=w-b1;
	        int a3=a1-a;
	        if(a3<0)a3=-a3;
	        int b3=b1-b;
	        if(b3<0)b3=-b3;
	        System.out.println(a3+b3);}
	}
	
I.打印大X

小明希望用星号拼凑,打印出一个大X,他要求能够控制笔画的宽度和整个字的高度.为了便于比对空格,所有的空白位置都以句点符来代替.
要求输入两个整数m n,表示笔的宽度,X的高度.用空格分开(O 要求输出一个大X
例如,用户输入:

3 9

输出:


 

 

参考代码  


import java.util.Scanner;

public class 打印大X {
	
public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m=sc.nextInt();
        int n=sc.nextInt();
        int k=n-1-m; //点数
        int len=k+2*m;//列数
        
        char[][] c=new char[n][len];
        
        for (int i = 0; i < n; i++) {
            for (int j = i; j < m+i; j++) {
                c[i][j]='*';
            }
            int j = len-1-i;
            for (int l = 0; l < m; l++,j--) {
                c[i][j]='*';
            }
        }
        for (int i = 0; i < c.length; i++) {
            for (int j = 0; j < c[0].length; j++) {
                if (c[i][j]!='*'){
                    c[i][j]='.';
                }
            }
        }
        for (int i = 0; i < c.length; i++) {
            for (int j = 0; j < c[0].length; j++) {
                System.out.print(c[i][j]);
            }
            System.out.println();
        }

    }
	
}

J.垒骰子

 

参考代码  
import java.util.Scanner;
 public class Main{ 
private static int n,m; private static final long MOD = 1000000007; 
private static int[] op = new int[7];

private static void init(){
    op[1] = 4;
    op[2] = 5;
    op[3] = 6;
    op[4] = 1;
    op[5] = 2;
    op[6] = 3;
}

public static void main(String[] args){
    init();
    Scanner sc = new Scanner(System.in);
    n = sc.nextInt();
    m = sc.nextInt();

    long conflict[][] = new long[6][6];
    for(int i = 0; i < 6; i++){
        for(int j = 0; j < 6; j++){
            conflict[i][j]=1;
        }
    }
    //建立冲突矩阵
    for(int i = 0; i < m; i++){
        int a = sc.nextInt();
        int b = sc.nextInt();
        conflict[op[a]-1][b-1]=0;
        conflict[op[b]-1][a-1]=0;
    }
    //求冲突矩阵的n-1次方
    long[][] mPow_n_1 = mPow(conflict,n-1);
    //累加矩阵的每个元素
    long res = 0;
    for(int i = 0; i < 6; i++){
        for(int j = 0; j < 6; j++){
            res = (res + mPow_n_1[i][j])%MOD;
        }
    }
    //res*4的n次方
    System.out.println(res*power(4,n)%MOD);
}

private static long power(long i,int n){
    long ans = 1;
    while(n!=0){
        if((n&1)==1){
            ans = (ans*i)%MOD;
        }
        i = (i*i)%MOD;
        n>>=1;
    }

    return ans;
}
/**
*矩阵的快速幂
*/
private static long[][] mPow(long[][] conflict, int n){
    long[][] e = new long[6][6];
    for(int i = 0; i < 6; i++){
        for(int j = 0; j < 6; j++){
            if(i == j){
                e[i][j] = 1;
            }else {
                e[i][j] = 0;
            }
        }
    }

    while(n!=0){
        if((n&1)==1){
            e = mMul(e,conflict);
        }
        conflict = mMul(conflict,conflict);
        n>>=1;

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/562826.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-02
下一篇 2022-04-02

发表评论

登录后才能评论

评论列表(0条)