zoukankan      html  css  js  c++  java
  • 第六届蓝桥杯JavaC组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论

    题目1、隔行变色

    隔行变色

    Excel表的格子很多,为了避免把某行的数据和相邻行混淆,可以采用隔行变色的样式。
    小明设计的样式为:第1行蓝色,第2行白色,第3行蓝色,第4行白色,…
    现在小明想知道,从第21行到第50行一共包含了多少个蓝色的行。

    请你直接提交这个整数,千万不要填写任何多余的内容。

    public class Main {
        
        public static void main(String[] args) {
            int count = 0;
            for(int i = 21;i <= 50;i++) {
                if(i % 2 == 1)
                    count++;
            }
            System.out.println(count);
        }
    }
    
    题目2、立方尾不变

    立方尾不变

    有些数字的立方的末尾正好是该数字本身。
    比如:1,4,5,6,9,24,25,…

    请你计算一下,在10000以内的数字中(指该数字,并非它立方后的数值),符合这个特征的正整数一共有多少个。

    请提交该整数,不要填写任何多余的内容。

    结果:36

    public class Main {
        
        public static void main(String[] args) {
            int count = 0;
            for(long i = 1;i <= 10000;i++) {
                long temp = i * i * i;
                String A = temp + "";
                String B = i + "";
                int len = B.length();
                int judge = Integer.valueOf(A.substring(A.length() - len, A.length()));
                if(i == judge) {
                    System.out.println("i = "+i+", A = "+A);
                    count++;
                }
            }
            System.out.println(count);
        }
    }
    
    题目3、无穷分数

    无穷分数

    无穷的分数,有时会趋向于固定的数字。
    请计算【图1.jpg】所示的无穷分数,要求四舍五入,精确到小数点后5位,小数位不足的补0。

    请填写该浮点数,不能填写任何多余的内容。
    结果:0.58198

    在这里插入图片描述

    public class Main {
        
        public static void main(String[] args) {
            
            double temp = 10000000 * 1.0 / 1000001;
            double result = 0;
            for(int i = 10000000;i >= 1;i--) {
                result = i - 1 + temp;
                temp = (i - 1) / result;
            }
            System.out.printf("%.5f",result);
        }
    }
    
    题目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 Main {
    
      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(;;)
        {
          v.add(n);
          n *= 10;
          n = n % m;
          if(n==0) return 0;
            if(v.indexOf(n)>=0) return v.size()-v.indexOf(n); //填空
        }
      }
    
    }
    
    题目5、格子中输出
    格子中输出
    
    stringInGrid方法会在一个指定大小的格子中打印指定的字符串。
    要求字符串在水平、垂直两个方向上都居中。
    如果字符串太长,就截断。
    如果不能恰好居中,可以稍稍偏左或者偏上一点。
    
    下面的程序实现这个逻辑,请填写划线部分缺少的代码。
    
        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<width-2;i++) System.out.print("-");
            System.out.println("+");
            
            for(int k=1; k<(height-1)/2;k++){
                System.out.print("|");
                for(int i=0;i<width-2;i++) System.out.print(" ");
                System.out.println("|");
            }
            
            System.out.print("|");
            
            String ff = _______________________________________________________;  //填空
            System.out.print(String.format(ff,"",s,""));
                      
            System.out.println("|");
            
            for(int k=(height-1)/2+1; k<height-1; k++){
                System.out.print("|");
                for(int i=0;i<width-2;i++) System.out.print(" ");
                System.out.println("|");
            }    
            
            System.out.print("+");
            for(int i=0;i<width-2;i++) System.out.print("-");
            System.out.println("+");    
        }
    
    对于题目中数据,应该输出:
    +------------------+
    |                  |
    |     abcd1234     |
    |                  |
    |                  |
    +------------------+
    
    (如果出现对齐问题,参看【图1.jpg】)
    
    //注意:ff中有三个%s分别对应第一段空格字符,第二段函数给定变量s字符串字符,第三段空格字符
    //其中%s表示打印一个字符串变量,%is表示打印出长度为i的空格字符串
    //System.out.print(String.format(ff,"",s,""));该语句后面"",s,""分别表示变量1,2,3。即对应第一段字符串,第二段字符串,第三段字符串。而ff则为输出格式。
    
    "%"+((width-2-s.length())/2)+"s%s%"+((width-1-s.length())/2)+"s"
    
    题目6、奇妙的数字

    奇妙的数字

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

    请填写该数字,不要填写任何多余的内容。

    结果:69

    import java.util.Arrays;
    
    public class Main {
        
        public static void main(String[] args) {
            for(long i = 10;i < 200;i++) {
                long temp1 = i * i;
                long temp2 = i * i * i;
                String A = temp1 + "";
                String B = temp2 + "";
                int len = A.length() + B.length();
                if(len == 10) {
                    long[] array = new long[10];
                    int j = 0;
                    while(temp1 > 0) {
                        array[j++] = temp1 % 10;
                        temp1 = temp1 / 10;
                    }
                    while(temp2 > 0) {
                        array[j++] = temp2 % 10;
                        temp2 = temp2 / 10;
                    }
                    Arrays.sort(array);
                    for(j = 0;j < 10;j++) {
                        if(array[j] == j)
                            continue;
                        else
                            break;
                    }
                    if(j == 10)
                        System.out.println("i = "+i+", i^2 = "+(i*i)+", i^3 = "+(i*i*i));
                }
            }
        }
    }
    
    题目7、加法变乘法

    题目描述
    我们都知道:1+2+3+ … + 49 = 1225
    现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015

    比如:
    1+2+3+…+1011+12+…+2728+29+…+49 = 2015
    就是符合要求的答案。

    请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。

    注意:需要你提交的是一个整数,不要填写任何多余的内容。

    public class 加法变乘法 {
    	
    public static void main(String[] args) {
    	int a,b,c,d;
    	for(int i=1;i<=49;i++) {
    		a=i;
    		b=i+1;
    		for(int j=i+2;j<=49;j++) {
    			c=j;
    			d=j+1;
    			if(a*b+c*d-(a+b)-(c+d)==790&&a!=10) {
    				System.out.println(a);
    				break;
    			}
    		}
    	}
    }
    }
    
    题目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,否则按无效代码处理。

        public static void main(String[] args) {
            Scanner input =new Scanner(System.in);
            int length = input.nextInt();
            int one = input.nextInt();
            int two = input.nextInt();
    
            int ox=one/length;
            int oy=one%length;
            int tx=two/length;
            int ty=two%length;
    
            if(one%length==0){
                oy=length;
            }else{
                ox=ox+1;
            }
            if(two%length==0){
                ty=length;
            }else{
                tx=tx+1;
            }
            if(ox%2==0){
                oy=length-oy+1;
            }
            if(tx%2==0){
                ty=length-ty+1;
            }
            System.out.println(Math.abs(ox-tx)+Math.abs(oy-ty));
        }
    
    题目9、打印大X
    打印大X
    
    小明希望用星号拼凑,打印出一个大X,他要求能够控制笔画的宽度和整个字的高度。
    为了便于比对空格,所有的空白位置都以句点符来代替。
    
    要求输入两个整数m n,表示笔的宽度,X的高度。用空格分开(0<m<n, 3<n<1000, 保证n是奇数)
    要求输出一个大X
    
    例如,用户输入:
    9
    程序应该输出:
    ***.....***
    .***...***.
    ..***.***..
    ...*****...
    ....***....
    ...*****...
    ..***.***..
    .***...***.
    ***.....***
    
    (如有对齐问题,参看【图1.jpg】)
    
    再例如,用户输入:
    21
    程序应该输出
    ****................****
    .****..............****.
    ..****............****..
    ...****..........****...
    ....****........****....
    .....****......****.....
    ......****....****......
    .......****..****.......
    ........********........
    .........******.........
    ..........****..........
    .........******.........
    ........********........
    .......****..****.......
    ......****....****......
    .....****......****.....
    ....****........****....
    ...****..........****...
    ..****............****..
    .****..............****.
    ****................****
    
    (如有对齐问题,参看【图2.jpg】)
    
    
    资源约定:
    峰值内存消耗(含虚拟机) < 256M
    CPU消耗  < 1000ms
    
    
    请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
    
    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
    注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
    注意:主类的名字必须是:Main,否则按无效代码处理。
    
    import java.util.Scanner;
    
    public class Main {
        
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            int m = in.nextInt();
            int n = in.nextInt();
            char[][] A = new char[n][n + m - 1];
            for(int i = 0;i < n;i++)
                for(int j = 0;j < n + m - 1;j++)
                    A[i][j] = '.';
            int mid = n / 2;
            for(int i = 0;i <= mid;i++) {
                int startL = i, endL = i + m - 1;      //X左边星号开始于截止纵坐标
                int startR = n  - 1 - i, endR = n + m - 2 - i; //X右边星号起止纵坐标
                for(int j = startL;j <= endL;j++) {
                    A[i][j] = '*';
                    A[n - 1 - i][j] = '*';
                }
                for(int j = startR;j <= endR;j++) {
                    A[i][j] = '*';
                    A[n - 1 - i][j] = '*';
                }
            }
            //打印题意结果
            for(int i = 0;i < n;i++) {
                for(int j = 0;j < n + m - 1;j++)
                    System.out.print(A[i][j]);
                System.out.println();
            }
        }
    }
    
    题目10、垒骰子

    题目描述
    赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体。
    经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥!
    我们先来规范一下骰子:1 的对面是 4,2 的对面是 5,3 的对面是 6。
    假设有 m 组互斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来。 atm想计算一下有多少种不同的可能的垒骰子方式。
    两种垒骰子方式相同,当且仅当这两种方式中对应高度的骰子的对应数字的朝向都相同。
    由于方案数可能过多,请输出模 10^9 + 7 的结果。

    不要小看了 atm 的骰子数量哦~

    「输入格式」
    第一行两个整数 n m
    n表示骰子数目
    接下来 m 行,每行两个整数 a b ,表示 a 和 b 不能紧贴在一起。

    「输出格式」
    一行一个数,表示答案模 10^9 + 7 的结果。

    「样例输入」
    2 1
    1 2

    「样例输出」
    544

    「数据范围」
    对于 30% 的数据:n <= 5
    对于 60% 的数据:n <= 100
    对于 100% 的数据:0 < n <= 10^9, m <= 36

    资源约定:
    峰值内存消耗(含虚拟机) < 256M
    CPU消耗 < 2000ms

    请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
    注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
    注意:主类的名字必须是:Main,否则按无效代码处理。

    解法一:

    public class 垒骰子_9_滚动数组 {
    	private static int a[][] = new int[10][10];//存放6个面的排斥关系,只用到数组下标1~7
    	
    	private static int b[] = new int [7];//对立面
    	private static long count ;
    	private static long C = 1000000007;
    	
    	private static boolean check(int current,int last)
    	{
    		if(a[current][last]==1)//说明两个骰子互相排斥
    		{
    			return true;
    		}
    		return false;
    	}
    	
    	
    	
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		b[1]=4;b[4]=1;
    		b[2]=5;b[5]=2;
    		b[3]=6;b[6]=3;
    		int n,m,a1,a2;
    		Scanner in = new Scanner(System.in);
    		n = in.nextInt();
    		int num = 4;
    		m = in.nextInt();
    		for(int i = 0;i<m;i++)
    		{
    			a1 = in.nextInt();
    			a2 = in.nextInt();
    			a[a1][a2]=1;
    			a[a2][a1]=1;
    		}
    		//滚动数组
    		int dp[][] = new int[2][7];//dp[i][j]表示某一高度的骰子j面朝上的方案数
    		int e = 0;
    		for(int i=1;i<7;i++)
    		{
    			dp[e][i]=1;//初始化 已知高度为1的骰子的方案只有一种,此处忽略结果×4的情况,在下面加上
    		}
    		for(long i=2;i<=n;i++)//从第二颗骰子算,到第n颗
    		{
    			e = 1-e;
    			num = (int) ((num*4)%C);
    			for(int j = 1;j<7;j++)//遍历当前骰子各面
    			{
    				dp[e][j]=0;//初始化下一颗骰子j面朝上的方案数为0
    				
    				for(int k = 1;k<7;k++)//遍历之前一颗骰子的6个面
    				{
    					if(!check(k,b[j]))//不相互排斥,k为之前下方骰子的朝上面,b[j]为当前骰子朝上面的对立面,即朝下面
    					{
    						dp[e][j] += dp[1-e][k];
    					}
    				}
    				dp[e][j] = (int) (dp[e][j]%C);
    				
    			}
    		}
    		for(int i = 1;i<7;i++)
    		{
    			count += dp[e][i];
    			count = count%C;
    		}
    		count = (count*num)%C;//这个地方相乘后仍然很大,是这个算法的弊端
    		//count = quickPow(10,33,1000000007);
    		System.out.println(count);
    	}
    	
    	//整数快速幂,写在这里只是为了加强记忆,这个地方没用,为后续快速矩阵幂解法做铺垫
    	private static long quickPow(long count2,int n,long mod)
    	{
    		long res = count2;
    		long ans = 1;
    		while(n!=0)
    		{
    			if((n&1)==1)
    			{
    				ans = (ans*res)%mod;
    			}
    			res = (res*res)%mod;
    			n >>= 1;
    		}
    		return ans;
    	}
    }
    











    解法二:
    此篇java代码实现了快速矩阵幂来计算前n-1个6*6阶矩阵的乘积,最后的sum相当于传送门里博主的B矩阵求和,也就是最终没有乘4n的答案,这样就得到了第n个骰子各面朝上的所有情况,当然要记得最后乘个4n,在这里顺便也给出了整数快速幂的实现。

    public class 垒骰子_9_快速矩阵幂 {
    	private static int mod = 1000000007;
     
    	static class Matrix
    	{
    		int a[][]= new int [6][6];
    		
    		public Matrix(){}
    		
    		public Matrix(int x)//初始化对角线元素,以构造单位矩阵
    		{
    			for(int i = 0;i<6;i++)
    			{
    				for(int j=0;j<6;j++)
    				{
    					a[i][j]= 0;
    				}
    			}
    			for(int i = 0;i<6;i++)
    			{
    				a[i][i] = x;
    			}
    		}
    	}
    	
    	public static int q_pow(int m,int n,int mod)//计算m^n
    	{
    		int base = m;
    		int ans = 1;
    		while(n>0)
    		{
    			if((n&1)==1)
    				ans = (ans*base)%mod;
    			base = (base*base)%mod;
    			n>>=1;
    		}
    		return ans;
    	}
    	
    	public static Matrix mul(Matrix m1,Matrix m2)
    	{
    		Matrix m = new Matrix();
    		for(int i = 0;i<6;i++)
    		{
    			for(int j = 0;j<6;j++)
    			{
    				for(int k = 0;k<6;k++)
    				{
    					m.a[i][j] += (m1.a[i][k]*m2.a[k][j])%mod;
    				}
    			}
    		}
    		return m;
    	}
    	public static Matrix q_pow(Matrix m,int n)
    	{
    		Matrix ans = new Matrix(1);//这里要变成单位矩阵
    		Matrix base = m;
    		while(n>0)
    		{
    			if((n&1)==1)
    				ans = mul(ans,base);
    			base = mul(base,base);
    			n>>=1;
    		}
    		return ans;
    	}
    	
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		int n,m,a1,a2;
    		int sum = 0;
    		Scanner in = new Scanner(System.in);
    		n = in.nextInt();
    		int num;
    		m = in.nextInt();
    		Matrix matrix = new Matrix();
    		for(int i = 0;i<6;i++)
    		{
    			for(int j=0;j<6;j++)
    			{
    				matrix.a[i][j]= 1;
    			}
    		}
    		for(int i = 0;i<m;i++)
    		{
    			a1 = in.nextInt();
    			a2 = in.nextInt();
    			matrix.a[a1-1][a2-1]=0;
    			matrix.a[a2-1][a1-1]=0;
    		}
    		//快速矩阵幂运算
    		Matrix final_matrix = q_pow(matrix,n-1);
    		for(int i=0;i<6;i++)
    		{
    			for(int j=0;j<6;j++)
    			{
    				sum = (sum+final_matrix.a[i][j])%mod;
    			}
    		}
    		num = q_pow(4,n,mod);
    		System.out.println((sum*num)%mod);
    	}
     
    }
    
  • 相关阅读:
    无限维
    黎曼流形
    why we need virtual key word
    TOJ 4119 Split Equally
    TOJ 4003 Next Permutation
    TOJ 4002 Palindrome Generator
    TOJ 2749 Absent Substrings
    TOJ 2641 Gene
    TOJ 2861 Octal Fractions
    TOJ 4394 Rebuild Road
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12948150.html
Copyright © 2011-2022 走看看