蓝桥杯训练第一天

 

题目本身不难,但如果发现不了陷阱,这题便无法通过。

求第 20190324 项的最后 4 位数字!

稍不注意,当作直接求该数列的第20190324项,然后再看最后4位数字是多少!然而这样出题的意义在哪里?何不直接让你吧20190324项完全写出?

所以,应当敏锐地察觉必然有坑在其中,很自然地联想到极有可能是因为累加到后面,数列的项过大超过表示范围。那么用long行不行呢?暂时不知道但完全不必去用,在求项时候对项模10000即可(最后4位数)。

public class Fabonacci2 {
    public static void main(String args[]){
        int[] arr = new int[3];
        //给前三项赋初值
        arr[0] = 1;
        arr[1] = 1;
        arr[2] = 1;

        int count = 4;//记录项数,此时表示应求第四项
        int num=0;

        while (count!=20190325){
            num = (count - 1) % 3;
            arr[num] = (arr[0] + arr[1] + arr[2]) % 10000;//依次更新数组中的值
            count++;
        }
        
        System.out.print(arr[num]);
    }
}

 这一题我最开始居然想通过排列组合去解决,简直天方夜谭。依我看,蓝桥杯的选择题除了能够直接看出结果的以外,其他的绝对要通过编程去测算。

思路是,首先,分解成3个各不相同的正整数之和,实现各不相同可以通过使三个数依次递增,反正不分顺序!

public class Break {
    public static void main(String args[]){
        int n = 2019;
        int i,j,k;
        int count = 0;//记录满足题意的式子数
        
        //数递增的思路
        for (i=1;i<n/2;i++){
            if(judge(i))
                continue;
            for (j=i+1;j<n;j++){
                if(judge(j))
                    continue;
                for(k=j+1;k<n;k++){
                    if(judge(k))
                        continue;
                    if(i+j+k==n)
                        count++;
                }
            }
        }
        
        System.out.println(count);
    }

    public static boolean judge(int n){
        int a = n;
        boolean flag = false;
        
        //只要n的某一位有2或者4就满足
        while (a>0){
            if(a%10==2||a%10==4){
                flag = true;
                break;
            }
            a = a / 10;
        }
        
        return flag;
    }
}

 这一题本来毫无含金量可言的,但无奈我对于一些细节的把握尚不到位,还是记录下这一题。

import java.util.*;
public class WordAnalysis {
    public static void main(String args[]){
        Scanner in = new Scanner(System.in);
        String word = in.nextLine();
        int i;
        int k,temp;
        char ch = 'a';
        int[] arr = new int[26];//此数组存各字母出现的个数

        for(i=0;i<word.length();i++){
            k = word.charAt(i) - 'a';//假定arr[0]代表a的个数,arr[1]代表b的个数...以此类推
            arr[k]++;
        }
        temp = 0;

        //直接求出出现次数最多的字母,而且由于是由a到z搜索的,所以满足输出的是字典序最小的字母
        for(k=0;k<26;k++){
            if(temp<arr[k]){
                temp = arr[k];
                ch = (char)('a'+k);//强制类型转换,这是之前没想到的
            }
        }

        System.out.println(ch);
        System.out.println(temp);
    }
}

做个笔记:Math.round(int)四舍五入,前面要写 import java.lang.*;

问题描述

  魔方可以对它的6个面自由旋转。

  我们来操作一个2阶魔方,如图:

 为了描述方便,我们为它建立了坐标系。

  各个面的初始状态如下:
  x轴正向:绿
  x轴反向:蓝
  y轴正向:红
  y轴反向:橙
  z轴正向:白
  z轴反向:黄

  假设我们规定,只能对该魔方进行3种操作。分别标记为:
  x 表示在x轴正向做顺时针旋转
  y 表示在y轴正向做顺时针旋转
  z 表示在z轴正向做顺时针旋转

  xyz 则表示顺序执行x,y,z 3个操作

题目的要求是:
  用户从键盘输入一个串,表示操作序列。
  程序输出:距离我们最近的那个小方块的3个面的颜色。
  顺序是:x面,y面,z面。

输入输出用例

  例如:在初始状态,应该输出:
  绿红白

  初始状态下,如果用户输入:
  x
  则应该输出:
  绿白橙


  初始状态下,如果用户输入:
  zyx
  则应该输出:
  红白绿

这个应该是暂时碰到的最具挑战性的题目。倒不是说解题过程有多么深奥难懂,相反,答案易于理解。难点在于此题要找到合适的方法去存放数据,像我一开始想靠一个三维数组存放结果就贻笑大方了。三维数组放点还差不多,这一个一个小方块怎么用三维数组存?

看了答案本来都打算直接复制粘贴了,可一想到这是个绝佳的锻炼敲码能力的机会,还是“绝知此事要躬行”!

有点无语的是,同样的算法,如果用c++一点毛病也没有,而用Java就超时了。唉,既然选择了Java组便只能一条路走到黑了。。。以后如果想到新点子再重新测试一下。

import java.util.Scanner;
public class MagicCube {
    public static void main(String args[]){
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        int j,k;
        for (j=0;j<6;j++){//初始化颜色
            for (k=0;k<4;k++){
                arr1[j][k] = j;
            }
        }
        for(int i=0;i<str.length();i++){
            init();//每次把arr2变为变化前的颜色状态
            if(str.charAt(i)=='x')
                turnx();
            else if(str.charAt(i)=='y')
                turny();
            else if(str.charAt(i)=='z')
                turnz();
        }
        print(arr1[0][2]);
        print(arr1[2][0]);
        print(arr1[4][3]);
    }
    public static int[][] arr1 = new int[6][4];
    public static int[][] arr2 = new int[6][4];
    public static void init(){
        for (int i=0;i<6;i++){
            for (int j=0;j<4;j++){
                arr2[i][j] = arr1[i][j];
            }
        }
    }
    public static void print(int a){
        switch (a){
            case 0:
                System.out.print("绿");
                break;
            case 1:
                System.out.print("蓝");
                break;
            case 2:
                System.out.print("红");
                break;
            case 3:
                System.out.print("橙");
                break;
            case 4:
                System.out.print("白");
                break;
            case 5:
                System.out.print("黄");
                break;
        }
    }
    public static void turnx(){
        arr1[0][0] = arr2[0][1];
        arr1[0][1] = arr2[0][3];
        arr1[0][2] = arr2[0][0];
        arr1[0][3] = arr2[0][2];
        arr1[2][0] = arr2[4][1];
        arr1[2][1] = arr2[4][3];
        arr1[5][2] = arr2[2][0];
        arr1[5][0] = arr2[2][1];
        arr1[3][3] = arr2[5][2];
        arr1[3][2] = arr2[5][0];
        arr1[4][1] = arr2[3][3];
        arr1[4][3] = arr2[3][2];
    }
    public static void turny(){
        arr1[2][0] = arr2[2][1];
        arr1[2][1] = arr2[2][3];
        arr1[2][3] = arr2[2][2];
        arr1[2][2] = arr2[2][0];
        arr1[5][2] = arr2[4][2];
        arr1[5][3] = arr2[4][3];
        arr1[0][3] = arr2[5][3];
        arr1[0][2] = arr2[5][2];
        arr1[4][2] = arr2[0][2];
        arr1[4][3] = arr2[0][3];
        arr1[1][2] = arr2[4][2];
        arr1[1][3] = arr2[4][3];
    }
    public static void turnz(){
        arr1[4][0] = arr2[4][1];
        arr1[4][1] = arr2[4][3];
        arr1[4][2] = arr2[4][0];
        arr1[4][3] = arr2[4][2];
        arr1[1][1] = arr2[3][2];
        arr1[1][3] = arr2[3][0];
        arr1[3][2] = arr2[0][2];
        arr1[3][0] = arr2[0][0];
        arr1[0][0] = arr2[2][0];
        arr1[0][2] = arr2[2][2];
        arr1[2][0] = arr2[1][3];
        arr1[2][2] = arr2[1][1];
    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

他化自在天魔咒

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

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

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

打赏作者

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

抵扣说明:

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

余额充值