• 算法笔记_110:第四届蓝桥杯软件类省赛真题(JAVA软件开发高职高专组部分习题)试题解答


     目录

    1 猜年龄

    2 组素数

    3 39级台阶

    4 核桃的数量

    5 打印十字图

    6 买不到的数目

     

    前言:以下试题解答代码部分仅供参考,若有不当之处,还请路过的同学提醒一下~


    1 猜年龄

    标题: 猜年龄
    
    
        美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。
    
        一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:
    
        “我年龄的立方是个4位数。我年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。”
    
        请你推算一下,他当时到底有多年轻。
    
        通过浏览器,直接提交他那时的年龄数字。
        注意:不要提交解答过程,或其它的说明文字。
    
    18
    直接枚举出所有可能的4位数,和6位数情况下的x,然后直接看结果,轻易知道是18。
    下面程序运行结果:
    x = 18, x^3 = 5832, x^4 = 104976
    x = 19, x^3 = 6859, x^4 = 130321
    x = 20, x^3 = 8000, x^4 = 160000
    x = 21, x^3 = 9261, x^4 = 194481
    public class Main {
        
        public void printResult() {
            for(int x = 1;x <= 100;x++) {
                int a = x * x * x;
                int b = x * x * x * x;
                if(a > 999 && a < 10000 && b > 99999 && b < 1000000) {
                    System.out.println("x = "+x+", x^3 = "+a+", x^4 = "+b);
                }
            }
        }
        
        public static void main(String[] args) {
            Main test = new Main();
            test.printResult();
        }
    }

    2 组素数

    标题: 组素数
    
        素数就是不能再进行等分的数。比如:2 3 5 7 11 等。
        9 = 3 * 3 说明它可以3等分,因而不是素数。
    
        我们国家在1949年建国。如果只给你 1 9 4 9 这4个数字卡片,可以随意摆放它们的先后顺序(但卡片不能倒着摆放啊,我们不是在脑筋急转弯!),那么,你能组成多少个4位的素数呢?
    
        比如:1949,4919 都符合要求。
    
    
    请你提交:能组成的4位素数的个数,不要罗列这些素数!!
    
    注意:不要提交解答过程,或其它的辅助说明文字。
    
    6
    import java.util.ArrayList;
    
    public class Main {
        public ArrayList<Integer> list = new ArrayList<Integer>();
        public static int count = 0;
        
        public boolean check(int[] A) {
            int num = A[0]*1000 + A[1]*100 + A[2]*10 + A[3];
            for(int i = 2;i < num;i++) {
                if(num % i == 0)
                    return false;
                if(i > num / 2)
                    break;
            }
            if(list.contains(num)) 
                return false;
            else {
                list.add(num);
            }
            return true;
        }
        
        public void swap(int[] A, int a, int b) {
            int temp = A[a];
            A[a] = A[b];
            A[b] = temp;
        }
        
        public void dfs(int[] A, int step) {
            if(step == A.length) {
                if(check(A)) {
                    count++;
                    for(int i = 0;i < 4;i++)
                        System.out.print(A[i]);
                    System.out.println();
                    return;
                }
            } else {
                for(int i = step;i < A.length;i++) {
                    swap(A, i, step);
                    dfs(A, step + 1);
                    swap(A, i, step);
                }
            }
            return;
        }
        
        public static void main(String[] args) {
            Main test = new Main();
            int[] A = {1,9,4,9};
            test.dfs(A, 0);
            System.out.println("最终结果:"+count);
        }
    }

    3 39级台阶

    标题: 第39级台阶
    
        小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!
    
        站在台阶前,他突然又想着一个问题:
    
        如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要
    
    走偶数步。那么,上完39级台阶,有多少种不同的上法呢?
    
    
        请你利用计算机的优势,帮助小明寻找答案。
    
    要求提交的是一个整数。
    注意:不要提交解答过程,或其它的辅助说明文字。
    
    51167078
    public class Main {
        public static int count = 0;
        
        public void dfs(int sum, int step) {
            if(sum > 39)
                return;
            if(sum == 39) {
                if(step % 2 == 0)  //题意规定,第一步为左脚,最后一步为右脚
                    count++;
                return;
            } 
            dfs(sum + 1, step + 1);
            dfs(sum + 2, step + 1);
            return;
        }
        
        public static void main(String[] args) {
            Main test = new Main();
            test.dfs(0, 0);
            System.out.println(count);
        }
    }
    public class Main1 {
        
        public static void main(String[] args) {
            int[][] dp = new int[39][2];
            dp[0][0] = 1; //第一步必须迈左脚(题意规定),左脚到达第一个台阶只有1种可能
            dp[0][1] = 0; //第一步不能迈右脚,右脚无法到达一个台阶
            dp[1][0] = 1;  //左脚到达第二个台阶只有一种可能
            dp[1][1] = 1;  //右脚到达第二个台阶也只有一种可能
            for(int i = 2;i < 39;i++) {
                dp[i][0] = dp[i - 1][1] + dp[i - 2][1];  
                dp[i][1] = dp[i - 1][0] + dp[i - 2][0];
            }
            System.out.println(dp[38][1]);  //最终到达39个台阶,必须是右脚
        }
    }

    4 核桃的数量

    标题:核桃的数量
    
        小张是软件项目经理,他带领3个开发组。工期紧,今天都在加班呢。为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑)。他的要求是:
    
        1. 各组的核桃数量必须相同
        2. 各组内必须能平分核桃(当然是不能打碎的)
        3. 尽量提供满足1,2条件的最小数量(节约闹革命嘛)
    
    程序从标准输入读入:
    a b c
    a,b,c都是正整数,表示每个组正在加班的人数,用空格分开(a,b,c<30)
    
    程序输出:
    一个正整数,表示每袋核桃的数量。
    
    例如:
    用户输入:
    2 4 5
    
    程序输出:
    20
    
    再例如:
    用户输入:
    3 1 1
    
    程序输出:
    3
    
    
    
    资源约定:
    峰值内存消耗(含虚拟机) < 64M
    CPU消耗  < 1000ms
    
    
    请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
    
    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
    注意:不要使用package语句。不要使用jdk1.6及以上版本的特性。
    注意:主类的名字必须是:Main,否则按无效代码处理。
    import java.util.Scanner;
    
    public class Main {
        //求取a和b的最大公约数
        public int gcd(int a, int b) {
            if(b == 0)
                return a;
            return gcd(b, a % b);
        }
        
        public void printResult(int a, int b, int c) {
            int a1 = gcd(a, b);   
            int lcm1 = a * b / a1;  //a和b的最小公倍数
            int a2 = gcd(lcm1, c);
            int lcm2 = lcm1 * c / a2;  //a、b、c的最小公倍数
            System.out.println(lcm2);
        }
        
        public static void main(String[] args) {
            Main test = new Main();
            Scanner in = new Scanner(System.in);
            int a = in.nextInt();
            int b = in.nextInt();
            int c = in.nextInt();
            test.printResult(a, b, c);
        }
    }

    5 打印十字图

    标题:打印十字图
    
        小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示(可参见p1.jpg)
    
                         $$$$$$$$$$$$$
                         $           $
                       $$$ $$$$$$$$$ $$$
                       $   $       $   $
                       $ $$$ $$$$$ $$$ $
                       $ $   $   $   $ $
                       $ $ $$$ $ $$$ $ $
                       $ $ $   $   $ $ $
                       $ $ $ $$$$$ $ $ $
                       $ $ $   $   $ $ $
                       $ $ $$$ $ $$$ $ $
                       $ $   $   $   $ $
                       $ $$$ $$$$$ $$$ $
                       $   $       $   $
                       $$$ $$$$$$$$$ $$$
                         $           $
                         $$$$$$$$$$$$$
    
    
        对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
        
        为了能准确比对空白的数量,程序要求对行中的空白以句点(.)代替。
    
    输入格式:
    一个正整数 n (n<30) 表示要求打印图形的层数
    
    输出:
    对应包围层数的该标志。
    
    例如:
    用户输入:
    1
    程序应该输出:
    ..$$$$$..
    ..$...$..
    $$$.$.$$$
    $...$...$
    $.$$$$$.$
    $...$...$
    $$$.$.$$$
    ..$...$..
    ..$$$$$..
    
    再例如:
    用户输入:
    3
    程序应该输出:
    ..$$$$$$$$$$$$$..
    ..$...........$..
    $$$.$$$$$$$$$.$$$
    $...$.......$...$
    $.$$$.$$$$$.$$$.$
    $.$...$...$...$.$
    $.$.$$$.$.$$$.$.$
    $.$.$...$...$.$.$
    $.$.$.$$$$$.$.$.$
    $.$.$...$...$.$.$
    $.$.$$$.$.$$$.$.$
    $.$...$...$...$.$
    $.$$$.$$$$$.$$$.$
    $...$.......$...$
    $$$.$$$$$$$$$.$$$
    ..$...........$..
    ..$$$$$$$$$$$$$..
    
    请仔细观察样例,尤其要注意句点的数量和输出位置。
    
    
    资源约定:
    峰值内存消耗(含虚拟机) < 64M
    CPU消耗  < 1000ms
    
    
    请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
    
    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
    注意:不要使用package语句。不要使用jdk1.6及以上版本的特性。
    注意:主类的名字必须是:Main,否则按无效代码处理。
    import java.util.Scanner;
    
    public class Main {
        
        public void printResult(int n) {
            int len = 5 + 4 * n;  //易知,输入为n输出的图像一定为一个正方形,且边长为len
            char[][] A = new char[len][len];      //用于存放最终输出结果
            int x = len / 2;   //输出图像正中间的十字图像的正中间一点的坐标为(x, x)
            for(int i = 0;i < len;i++)
                for(int j = 0;j < len;j++)
                    A[i][j] = '.';    //初始化为'.',后续涂'$'
            //首先,涂图像正中间的十字
            for(int i = x - 2;i <= x + 2;i++) {
                A[i][x] = '$';   //涂十字的一竖
                A[x][i] = '$';   //涂十字的一横
            }
            //接着,涂正中间十字由内向外的十字圈,这里先图十字圈的上下一横和左右一竖
            for(int i = 0;i < n;i++) {  //i表示当前涂第i个十字圈(由内向外)
                for(int j = x - (2 + 2*i);j <= x + (2 + 2*i);j++) {
                    A[x - (4 + 2*i)][j] = '$'; //涂十字圈的上面一横
                    A[x + (4 + 2*i)][j] = '$'; //涂十字圈的下面一横
                    A[j][x - (4 + 2*i)] = '$'; //涂十字圈的左边一竖
                    A[j][x + (4 + 2*i)] = '$'; //涂十字圈的右边一竖
                }
            }
            //最后,涂十字圈的四个L形状的图形,根据对称填涂(由里向外)
            for(int i = 0;i < n;i++) {
                //填十字圈左上方的L形状的图形,共三个点
                A[x - (2 + 2*i)][x - (2 + 2*i)] = '$';
                A[x - (2 + 2*i)][x - (2 + 2*i) - 1] = '$';
                A[x - (2 + 2*i) - 1][x - (2 + 2*i)] = '$';
                //填右上方的L形状图形
                A[x - (2 + 2*i)][x + (2 + 2*i)] = '$';
                A[x - (2 + 2*i)][x + (2 + 2*i) + 1] = '$';
                A[x - (2 + 2*i) - 1][x + (2 + 2*i)] = '$';
                //填左下方的L形状的图形
                A[x + (2 + 2*i)][x - (2 + 2*i)] = '$';
                A[x + (2 + 2*i)][x - (2 + 2*i) - 1] = '$';
                A[x + (2 + 2*i) + 1][x - (2 + 2*i)] = '$';
                //填右下方的L形状的图形
                A[x + (2 + 2*i)][x + (2 + 2*i)] = '$';
                A[x + (2 + 2*i)][x + (2 + 2*i) + 1] = '$';
                A[x + (2 + 2*i) + 1][x + (2 + 2*i)] = '$';
            }
            //打印最终结果
            for(int i = 0;i < len;i++) {
                for(int j = 0;j < len;j++) {
                    System.out.print(A[i][j]);
                }
                System.out.println();
            }
            return;
        }
    
        
        public static void main(String[] args) {
            Main test = new Main();
            Scanner in = new Scanner(System.in);
            int n = in.nextInt();
            test.printResult(n);
        }
    }

    6 买不到的数目

    标题:买不到的数目
    
        小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
    
        小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
    
        你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
    
        本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
    
    输入:
    两个正整数,表示每种包装中糖的颗数(都不多于1000)
    
    要求输出:
    一个正整数,表示最大不能买到的糖数
    
    不需要考虑无解的情况
    
    例如:
    用户输入:
    4 7
    程序应该输出:
    17
    
    再例如:
    用户输入:
    3 5
    程序应该输出:
    7
    
    
    
     
    资源约定:
    峰值内存消耗(含虚拟机) < 64M
    CPU消耗  < 3000ms
    
    
    请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
    
    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
    注意:不要使用package语句。不要使用jdk1.6及以上版本的特性。
    注意:主类的名字必须是:Main,否则按无效代码处理。
    import java.util.Scanner;
    
    public class Main {
        public static int max = 0;
        
        public void printResult(int a, int b) {
            for(int i = 1;i <= a * b;i++) {
                int lenA = i / a;
                int lenB = i / b;
                boolean judge = true;
                for(int p = 0;p <= lenA;p++) {
                    for(int q = 0;q <= lenB;q++) {
                        if(p * a + q * b == i) {
                            judge = false;
                            break;
                        }
                    }
                    if(judge == false)
                        break;
                }
                if(judge == true) {
                    if(max < i)
                        max = i;
                }
            }
            System.out.println(max);
        }
        
        public static void main(String[] args) {
            Main test = new Main();
            Scanner in = new Scanner(System.in);
            int a = in.nextInt();
            int b = in.nextInt();
            test.printResult(a, b);
        }
    }
  • 相关阅读:
    UVa1225 Digit Counting
    UVa1586 Molar mass
    UVa1585 Score
    Java中的Set
    CentOS6.5 格式化大磁盘
    Ganglia监控Hadoop与HBase集群
    Hadoop HA + HBase环境搭建(二)————HBase环境搭建
    Hadoop HA + HBase环境搭建(一)————zookeeper和hadoop环境搭建
    在树莓派上安装MongoDB
    编译运行hadoop程序
  • 原文地址:https://www.cnblogs.com/liuzhen1995/p/6613930.html
Copyright © 2020-2023  润新知