蓝桥杯训练[2018/11/12]

今天群里得到消息, 68人取30人参加比赛, 50%少一些的录取率. 就算我去年参加过比赛, 但是, 也不代表我的状态是在参赛的选手中的中上, 要开始复习了.

 

问题 1083: Hello, world!

输入ASCII码, 将其转变为英文字母.

上代码:

import java.util.Scanner;

public class Main {

    public static void main(String[]arg) {

        Scanner sc=new Scanner(System.in);

        while(sc.hasNext()) {

            int n=sc.nextInt();

            System.out.print((char)n);

        }

    }

}

这道题的收获:

如何判断连续的输入?  while(sc.hasNext()){}

如何将ASCII码转换成字符码?  (char)n

eclipse mac EOF是什么?  contr+D

 

 

 

 

发现了网上有入门级的题目的选择栏

 

 

 

慢慢来, 先写这些题目热热手, 太久没写代码了.

 

1000 简单的a+b

数据的范围是不超过210, int型可以满足

我给出的答案是:

import java.util.Scanner;
public class Main {

    public static void main(String[] args) {
        /** 使用long型的变量报错了,
         * 我改成int型试试*/
        Scanner in = new Scanner(System.in);
        
        int a = in.nextInt();
        int b = in.nextInt();
        int final_num = a + b;
        
        System.out.println(final_num);
    }

}

然而, 一直答案错误, 我一度认为是数据的范围有问题, 然而, 并不是,这道题目是多组数据输入测试的, 因此不能直接的限制2个输入变量, 一个输出变量.

官网直接给出了解决的方法:

通过这 while(in.hasNext()) {} 来实现多行数据的输入

上代码:

import java.util.Scanner;
public class Main {

    public static void main(String[] args) {
        /** 使用long型的变量报错了,
         * 我改成int型试试
         * 问题不再数据范围, 而是测试数据数量的问题,
         * 因为是多行测试, 不能限定死2个测试数据就直接输出结果, 关闭程序*/
        Scanner in = new Scanner(System.in);
        while(in.hasNext()) {
            int a = in.nextInt();
            int b = in.nextInt();
            int final_num = a + b;
            System.out.println(final_num);
        }
    }

}

结果正确

 

1002

输入三个数, 判断输出最大的数.

没有数据范围的问题. 而且是单行数据测试.

核心的判断其实很简单, 上为代码:

if(a>b) {
    if(c>a) {
        输出c
    } else {
        输出a
    }
} else {
    if (c>b) {
        输出c
    } else {
        输出b
    }
}

通过的代码:

import java.util.Scanner;
public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        int c = sc.nextInt();
        if (a > b) {
            if (c > a) {
                System.out.println(c);
            } else {
                System.out.println(a);
            }
        } else {
            if (c > b) {
                System.out.println(c);
            } else {
                System.out.println(b);
            }
        }
    }

}

 

 

1003

将输入的字符串的每一位的字符修改为原字符ASCII后面4为的ASCII所对映的字符, 而且题目要求的结果就是输出China处理过后的字符串

public class Main {

    public static void main(String[] args) {
        // 题目要求输入的字符串为china
        char c[] = {'C', 'h', 'i', 'n', 'a'};
        for(int i = 0; i<c.length; i++) {
            char a = (char)(c[i]+4);
            System.out.print(a);
        }
        
    }

}

以上就是通过测试的Java代码.

但是, 我们想要求得的一个通用的程序, 也就是输入不一定是China, 可以是用户任意输入的, 那么应该如何改进能呢?

上代码:

import java.util.Scanner;
public class Main2 {

    public static void main(String[] args) {
        // Main.java的代码实现了当输入的字符串为固定的China时的解决方法, 
        // 但是如果我们要将其推广到其他的任意输入字符串都能够将其向后移动4为ASCII码
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();  //输入的字符串
        
        //直接将字符串当作数组来处理试试.
        for(int i = 0; i<str.length(); i++) {
            char new_str = (char)(str.charAt(i) + 4);
            System.out.print(new_str);
        }
        

    }

}

这段代码的思路是将字符串当作是一个数组来处理, 像处理数组一样处理字符串的每一位.

碰到的为题是: str[i]这种写法是错误的, 要修改成str.charAt(i), 通过字符串变量的charAt(i)方法来取得字符串第i位的字符.

 

 

1004: 母牛的故事

http://www.dotcpp.com/oj/problem1004.html

 
题目描述

有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?

 
输入

输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
n=0表示输入数据的结束,不做处理。

输出

对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。

 

样例输入
2
4
5
0

 

样例输出
2
4
6

个人的思路:
母牛每年都生小牛, 小牛在第4年开始, 每年也生一只小牛.

要有一个变量控制母牛的数量,另一个变量控制经过的时间

 看参考得知,n年的母牛的数量是n-1年的母牛的数量加上n-3年前的母牛的数量.

我通过打草稿也得到了相同的规律, 1-4年是一个规律, 第5年之后的规律都一样了.f[n] = f[n-1] + f[n-3]

 

 

 单个输入的情况已经完成了,上代码:

import java.util.Scanner;
public class Main {

    private static Scanner sc;
    public static void main(String[] args) {
        
        sc = new Scanner(System.in);
        int a = sc.nextInt();  //输入一个年份
        System.out.println(print_num(a));
    }
    public static int print_num(int a) {
        /** 使用递归的方法解题*/
        int out_num = 0;  //输出的数
        if (a <= 4) {
            out_num = a;
            //System.out.println(out_num);
            return out_num;
        } else if (a == 5) {
            out_num = 7;
            //System.out.println(out_num);
            return out_num;
        } else {
            out_num = print_num(a-1) + print_num(a-3);
            return out_num;
        }
    }
}

 

多输入的代码也完成了, 上代码:

 1 import java.util.Scanner;
 2 public class Main {
 3 
 4     private static Scanner sc;
 5     public static void main(String[] args) {
 6         
 7         sc = new Scanner(System.in);
 8         while(sc.hasNext()) {
 9             int a = sc.nextInt();  //输入一个年份
10             if (a == 0) {
11                 break;
12             }
13             System.out.println(print_num(a));
14         }
15 //        int a = sc.nextInt();  //输入一个年份
16 //        System.out.println(print_num(a));
17     }
18     public static int print_num(int a) {
19         /** 使用递归的方法解题*/
20         int out_num = 0;  //输出的数
21         if (a <= 4) {
22             out_num = a;
23             //System.out.println(out_num);
24             return out_num;
25         } else {
26             out_num = print_num(a-1) + print_num(a-3);
27             return out_num;
28         }
29     }
30 }

 第8行实现了多行输入的功能, 第10~12行实现了输入0退出程序的功能.

 

1005

Java保留两位小数的方法:

方法一: String.format打印最简便, 上代码:

import java.util.Scanner;
public class Main {
    
    private static Scanner sc;
    
    public static void main(String[] args) {
        sc = new Scanner(System.in);
        double num = sc.nextDouble();
        double f_num=5 * (num-32) / 9;
        System.out.println(String.format("c=%.2f", f_num));
    }

}

方法二: DecimalFormat转换最简便, 上代码:

import java.text.DecimalFormat;
import java.util.Scanner;

public class Main {
    
    private static Scanner sc;
    
    public static void main(String[] args) {
        
        sc = new Scanner(System.in);
        double num = sc.nextDouble();
        double f_num=5 * (num-32) / 9;
        DecimalFormat df = new DecimalFormat("#.00");  //数字格式化
        System.out.println("c="+df.format(f_num));
    }

}
DecimalFormat df = new DecimalFormat("#.00");设置了数字的格
 
   

方法三: NumberFormat

上代码:

可惜没有通过编译, 因为当数是整数的时候, 该方法不会自动的在后面添加小位小数.

import java.text.NumberFormat;
import java.util.Scanner;
public class Main {

    private static Scanner sc;
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        sc = new Scanner(System.in);
        double num = sc.nextDouble();
        double f_num=5 * (num-32) / 9;
        NumberFormat nf = NumberFormat.getNumberInstance();
        nf.setMaximumFractionDigits(2);
        System.out.println("c="+nf.format(f_num));  // 如果没有小数的化, 不会在小数后面自动的添加两位小数00, 这个方法应该通不过的.

    }

}

 

第四种方法: BigDecimal

可惜, 和第三种方法一样, 当结果是一个整数的时候, 这种方法不会在小数点后面添加两位零填补空位

上代码:

import java.math.BigDecimal;
import java.util.Scanner;

public class Main {

    private static Scanner sc;
    public static void main(String[] args) {
        
        sc = new Scanner(System.in);
        double num = sc.nextDouble();
        double f_num=5 * (num-32) / 9;
        BigDecimal bg = new BigDecimal(f_num);
        double f_num_2 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        System.out.println("c="+f_num_2);
        
    }

}

 

转载于:https://www.cnblogs.com/huangZ-H/p/9946996.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值