2014年第五届蓝桥杯javaC组省赛真题及解

第一题:武功秘籍

题目描述
小明带两个妹妹参加元宵灯会。别人问她们多大了,她们调皮地说:“我们俩的年龄之积是年龄之和的6倍”。小明又补充说:“她们可不是双胞胎,年龄差肯定也不超过8岁啊。”
请你写出:小明的较小的妹妹的年龄。
注意: 只写一个人的年龄数字,请通过浏览器提交答案。不要书写任何多余的内容。

题目分析
人狠话不多,直接上暴力。

题目代码

public class demo19 {
    public static void main(String[] args) {
        /*
        for (int i =1 ; i < 100; i++) {
            for (int j = 1; j <100 ; j++) {
                if ((i*j==6*(i+j))&&0<i-j&&i-j<8){
                    System.out.println(j);
                }
            }

        }*/
        int i = 1;
        while( i != 0){		//loop condition 不起作用;
            for(int j = i+1; j<= i+8; j++){
                if((i * j) == 6 * (i + j)){
                    System.out.println("较小的妹妹的年龄是"+i+"岁!");
                    System.exit(0);
                }
            }
            i++;
        }

    }
}

第二题:

题目描述
小明从银行贷款3万元。约定分24个月,以等额本金方式还款。
这种还款方式就是把贷款额度等分到24个月。每个月除了要还固定的本金外,还要还贷款余额在一个月中产生的利息。
假设月利率是:0.005,即:千分之五。那么,
第一个月,小明要还本金 1250, 还要还利息:30000 * 0.005,总计 1400
第二个月,本金仍然要还 1250, 但利息为:(30000-1250) * 0.005 总计 1393.75
问:小明在第15个月,应该还款多少(本金和利息的总和)?
请把答案金额四舍五入后,保留两位小数。注意:32.5,一定要写为:32.50
通过浏览器提交答案,这是一个含有小数点和两位小数的浮点数字。不要写多余内容(例如:多写了“元”或添加说明文字)
题目代码

public class demo20 {
    public static void main(String[] args) {
        double sum = 30000.0;
        double bmoney = 1250.0;
        double lmoney = sum * 0.005;
        double getmoney ;
        int month = 1;
        for (int i = 0; i <= 24; i++) {
            getmoney = bmoney + ((sum - ( bmoney * i )) * 0.005);
            if (month==15){
                System.out.printf("%.2f",getmoney);
            }
            month++;
        }
    }
}

第三题:猜字母

题目描述
把abcd…s共19个字母组成的序列重复拼接106次,得到长度为2014的串。
接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母。
得到的新串再进行删除奇数位置字母的动作。如此下去,最后只剩下一个字母,请写出该字母。
答案是一个小写字母,请通过浏览器提交答案。不要填写任何多余的内容。
题目代码

public class demo21 {
    public static void main(String[] args) {
        String s = "abcdefghijklmnopqrs";
        String str = "";
        for (int i = 0; i < 106; i++) {
            str += s;
        }
        //System.out.println(str.length());
        boolean[] flag = new boolean[str.length()];
        for (int i = 0; i < flag.length; i++) {
            flag[i] = true;        //未被删除的字母标记为true
        }

        int oldIndex = 0;  //旧串的下标
        int newIndex = 0;  //新串的下标
        int leftCount = str.length();  //剩余的字母数

        while(leftCount > 1){             //最后只剩下一个字母

            if (flag[oldIndex] == true) {  //如果该字母未被删除
                if (newIndex % 2 == 0) {  //看此时(新串)的下标是否需要被删除
                    flag[oldIndex] = false;   //删除该字母
                    leftCount--;         //剩余字母数-1
                }
                newIndex++;           //未被删除的字母构成新串
            }
            oldIndex++;              //旧串的遍历

            //得到的新串再进行删除奇数位置字母的动作,所以下标都重新置为0
            if (oldIndex == str.length()) {
                newIndex = 0;
                oldIndex = 0;
            }
        }

        for (int i = 0; i < flag.length; i++) {
            if (flag[i] == true) {
                System.out.println(str.charAt(i));
                break;
            }
        }
    }

}
 

第四题:大衍数列

题目描述
中国古代文献中,曾记载过“大衍数列”, 主要用于解释中国传统文化中的太极衍生原理。
它的前几项是:0、2、4、8、12、18、24、32、40、50 …
其规律是:对偶数项,是序号平方再除2,奇数项,是序号平方减1再除2。
以下的代码打印出了大衍数列的前 100 项。
for(int i=1; i<100; i++)
{
if(________________) //填空
System.out.println(ii/2);
else
System.out.println((i
i-1)/2);
}
请填写划线部分缺失的代码。通过浏览器提交答案。
注意:不要填写题面已有的内容,也不要填写任何说明、解释文字。
题目代码

   public class demo22 {
    public static void main(String[] args) {
        for(int i=1; i<100; i++)
        {
            if(i%2==0)  //填空
                System.out.println(i*i/2);
            else
                System.out.println((i*i-1)/2);
        }
    }
}

第五题:写日志

题目描述
写日志是程序的常见任务。现在要求在 t1.log, t2.log, t3.log 三个文件间轮流写入日志。也就是说第一次写入t1.log,第二次写入t2.log,… 第四次仍然写入t1.log,如此反复。
下面的代码模拟了这种轮流写入不同日志文件的逻辑。
public class A
{
private static int n = 1;
public static void write(String msg)
{
String filename = “t” + n + “.log”;
n = ____________;
System.out.println("write to file: " + filename + " " + msg);
}
}
请填写划线部分缺失的代码。通过浏览器提交答案。

注意:不要填写题面已有的内容,也不要填写任何说明、解释文字。
题目代码

public class demo23 {

        private static int n = 1;
        public static void write(String msg)
        {
            String filename = "t" + n + ".log";
            n = n%3+1;
            System.out.println("write to file: " + filename + " " + msg);
        }

}

第六题:李白打酒

题目描述
话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。
题目代码

public class demo24 {

    public static void main(String[] args) {

        digui(4, 1, 0, "a");// 遇到店
        digui(1, 0, 1, "b");// 遇到花

        System.out.println(result);

    }

    static int result;

    private static void digui(int j, int d, int h, String str) {

        if (d + h == 15) {
            if (j == 0) {
                int count = 0;
                for (int i = 0; i < str.length(); i++)
                    if (str.charAt(i) == 'b')
                        count++;
                if (count == 10 && str.charAt(14) == 'b') {
                    result++;
					System.out.println(str);
                }
            }
            return;
        }

        digui(j * 2, d + 1, h, str + "a");
        digui(j - 1, d, h + 1, str + "b");

    }

}

题目分析

第七题:奇怪的分式

题目描述
上小学的时候,小明经常自己发明新算法。一次,老师出的题目是:
1/4 乘以 8/5
小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png)
老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼!
对于分子、分母都是 1~9 中的一位数的情况,还有哪些算式可以这样计算呢?
请写出所有不同算式的个数(包括题中举例的)。
显然,交换分子分母后,例如:4/1 乘以 5/8 是满足要求的,这算做不同的算式。
但对于分子分母相同的情况,2/2 乘以 3/3 这样的类型太多了,不在计数之列!

注意:答案是个整数(考虑对称性,肯定是偶数)。请通过浏览器提交。不要书写多余的内容。

题目分析
在这里插入图片描述

题目代码

import java.lang.*;
public class demo25 {
    public static void main(String[] args) {
        int count = 0;
        for(int a=1;a<10;a++){      //第一个分子
            for(int b=1;b<10;b++){  //第一个分母分母
                for(int c=1;c<10;c++){  //分子
                    for(int d=1;d<10;d++){  //分母
                        if(a!=b && c!=d && (a*c*(b*10+d)==(b*d*(a*10+c)))){
                            cnt++;
                        }
                    }
                }
            }
        }
        System.out.println(count);
    }
}

第八题:兰顿蚂蚁

题目描述
兰顿蚂蚁,是于1986年,由克里斯·兰顿提出来的,属于细胞自动机的一种。
平面上的正方形格子被填上黑色或白色。在其中一格正方形内有一只“蚂蚁”。
蚂蚁的头部朝向为:上下左右其中一方。
蚂蚁的移动规则十分简单:
若蚂蚁在黑格,右转90度,将该格改为白格,并向前移一格;
若蚂蚁在白格,左转90度,将该格改为黑格,并向前移一格。
规则虽然简单,蚂蚁的行为却十分复杂。刚刚开始时留下的路线都会有接近对称,像是会重复,但不论起始状态如何,蚂蚁经过漫长的混乱活动后,会开辟出一条规则的“高速公路”。
蚂蚁的路线是很难事先预测的。
你的任务是根据初始状态,用计算机模拟兰顿蚂蚁在第n步行走后所处的位置。
数据格式

输入数据的第一行是 m n 两个整数(3 < m, n < 100),表示正方形格子的行数和列数。
接下来是 m 行数据。
每行数据为 n 个被空格分开的数字。0 表示白格,1 表示黑格。

接下来是一行数据:x y s k, 其中x y为整数,表示蚂蚁所在行号和列号(行号从上到下增长,列号从左到右增长,都是从0开始编号)。s 是一个大写字母,表示蚂蚁头的朝向,我们约定:上下左右分别用:UDLR表示。k 表示蚂蚁走的步数。

输出数据为两个空格分开的整数 p q, 分别表示蚂蚁在k步后,所处格子的行号和列号。

例如, 输入:
5 6
0 0 0 0 0 0
0 0 0 0 0 0
0 0 1 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
2 3 L 5
程序应该输出:
1 3

再例如, 输入:
3 3
0 0 0
1 1 1
1 1 1
1 1 U 6
程序应该输出:
0 0

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

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

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

import java.util.Scanner;
public class demo25 {
    public static void main(String[] args) {

            Scanner scan=new Scanner(System.in);
            int a=scan.nextInt();
            int b=scan.nextInt();
            int[][] c=new int[a][b];
            for(int i=0;i<a;i++){
                for(int j=0;j<b;j++){
                    c[i][j]=scan.nextInt();
                }
            }
            int x=scan.nextInt();
            int y=scan.nextInt();
            String s1=scan.next();//方向
            int k=scan.nextInt();//步数
            char s=s1.charAt(0);
            int sum=0;
            while(true){
                if(sum==k){
                    break;
                }
                if(s=='U'){
                    if(c[x][y]==1){
                        s='R';
                        c[x][y]=0;
                        x=x;
                        y=y+1;
                        sum++;
                        //    System.out.println(x+","+y);
                    }else{
                        s='L';
                        c[x][y]=1;
                        x=x;
                        y=y-1;
                        sum++;
                        //    System.out.println(x+","+y);
                    }
                }
                if(s=='D'){
                    if(c[x][y]==1){
                        s='L';
                        c[x][y]=0;
                        x=x;
                        y=y-1;
                        sum++;
                        //System.out.println(x+","+y);
                    }else{
                        s='R';
                        c[x][y]=1;
                        x=x;
                        y=y+1;
                        sum++;
                        //System.out.println(x+","+y);
                    }
                }

                if(s=='L'){
                    if(c[x][y]==1){
                        s='U';
                        c[x][y]=0;
                        x=x-1;
                        y=y;
                        sum++;
                        //System.out.println(x+","+y);
                    }else{
                        s='D';
                        c[x][y]=1;
                        x=x+1;
                        y=y;
                        sum++;
                        //System.out.println(x+","+y);
                    }
                }
                if(s=='R'){
                    if(c[x][y]==1){
                        s='D';
                        c[x][y]=0;
                        x=x+1;
                        y=y;
                        sum++;
                        //System.out.println(x+","+y);
                    }else{
                        s='U';
                        c[x][y]=1;
                        x=x-1;
                        y=y;
                        sum++;
                        //System.out.println(x+","+y);
                    }
                }
            }
            System.out.println(x+","+y);
        }
    }

第九题:地宫取宝

题目描述
X 国王有一个地宫宝库。是 n x m 个格子的矩阵。每个格子放一件宝贝。每个宝贝贴着价值标签。
地宫的入口在左上角,出口在右下角。
小明被带到地宫的入口,国王要求他只能向右或向下行走。
走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。
当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明。
请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这k件宝贝。
【数据格式】
输入一行3个整数,用空格分开:n m k (1<=n,m<=50, 1<=k<=12)
接下来有 n 行数据,每行有 m 个整数 Ci (0<=Ci<=12)代表这个格子上的宝物的价值
要求输出一个整数,表示正好取k个宝贝的行动方案数。该数字可能很大,输出它对 1000000007 取模的结果。

例如,输入:
2 2 2
1 2
2 1
程序应该输出:
2

再例如,输入:
2 3 2
1 2 3
2 1 5
程序应该输出:
14

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

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

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

import java.util.Scanner;
public class demo26 {
            static int[][] map;
            static int ans;
            static int n, m, k;
        public static void main(String[] args) {
                Scanner sc = new Scanner(System.in);
                n = sc.nextInt();
                m = sc.nextInt();
                k = sc.nextInt();

                map = new int[n][m];
                for (int i = 0; i < n; i++) {
                    for (int j = 0; j < m; j++) {
                        map[i][j] = sc.nextInt();
                    }
                }

                dfs(0, 0, -1, 0);
                System.out.println(ans);
            }

            /**
             *
             * @param i 所在格子的横坐标
             * @param j    所在格子的纵坐标
             * @param max    当前拥有的最大价值的宝贝的价值
             * @param cnt    当前拥有宝贝的数量
             */
            private static void dfs ( int i, int j, int max, int cnt){
                //当前拥有的宝贝数大k,不符合
                if (cnt > k) {
                    return;
                }
                //超出了边界
                if (i == n || j == m) {
                    return;
                }
                int price = map[i][j];
                //处于出口,判断当前是否满足要求
                if (i == n - 1 && j == m - 1) {
                    if (cnt == k || (cnt == k - 1 && price > max)) {
                        ans++;
                        ans %= 1000000007;
                    }
                    return;
                }
                //如果这个格子的宝贝大于拥有的最大价值则可以拿
                if (price > max) {
                    dfs(i + 1, j, price, cnt + 1);//下
                    dfs(i, j + 1, price, cnt + 1);//右
                }
                dfs(i + 1, j, max, cnt);//不拿 下
                dfs(i, j + 1, max, cnt);//不拿 右

            }
            
}

第十题:矩阵翻硬币

题目描述
小明先把硬币摆成了一个 n 行 m 列的矩阵。
随后,小明对每一个硬币分别进行一次 Q 操作。
对第x行第y列的硬币进行 Q 操作的定义:将所有第 ix 行,第 jy 列的硬币进行翻转。
其中i和j为任意使操作可行的正整数,行号和列号都是从1开始。
当小明对所有硬币都进行了一次 Q 操作后,他发现了一个奇迹——所有硬币均为正面朝上。
小明想知道最开始有多少枚硬币是反面朝上的。于是,他向他的好朋友小M寻求帮助。
聪明的小M告诉小明,只需要对所有硬币再进行一次Q操作,即可恢复到最开始的状态。然而小明很懒,不愿意照做。于是小明希望你给出他更好的方法。帮他计算出答案。

【数据格式】
输入数据包含一行,两个正整数 n m,含义见题目描述。
输出一个正整数,表示最开始有多少枚硬币是反面朝上的。

【样例输入】
2 3

【样例输出】
1

【数据规模】
对于10%的数据,n、m <= 10^3;
对于20%的数据,n、m <= 10^7;
对于40%的数据,n、m <= 10^15;
对于10%的数据,n、m <= 10^1000(10的1000次方)。

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

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

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

题目代码

import java.math.BigInteger;
import java.util.Arrays;
import java.util.Scanner;

public class demo27 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String n = sc.next();
        String m = sc.next();
        System.out.println(sqrt(n).multiply(sqrt(m)));
    }

    public static BigInteger sqrt(String num){
        int numLen = num.length();//要开方的数字位数
        int resLen = (numLen & 1) == 0 ? numLen / 2 : numLen / 2 + 1;//开方后数字的位数
        char[] arr = new char[resLen];//用于尝试结果的数组
        Arrays.fill(arr, '0');
        BigInteger target = new BigInteger(num);
        for(int pos = 0; pos < resLen; pos++){
            for(char i = '1'; i <= '9'; i++){
                arr[pos] = i;
                BigInteger pow = new BigInteger(String.valueOf(arr)).pow(2);
                if(pow.compareTo(target) == 1){
                    arr[pos] -= 1;
                    break;
                }
            }
        }
        return new BigInteger(String.valueOf(arr));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dem.o_c

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值