[蓝桥杯] 官方练习题 (入门+基础 )

蓝桥杯 官方练习题 (入门+基础 )

练习 Day1

试题 入门训练 Fibonacci数列 BEGIN-4

问题描述

Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。

当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

输入格式

输入包含一个整数n。

输出格式

输出一行,包含一个整数,表示Fn除以10007的余数。

样例输入

10

样例输出

55

思路

因为%操作满足分配律,所以只需保存每次加和后 %10007 的值即可。

import java.math.*;
import java.util.*;
public static void Main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int in = scanner.nextInt();
        int f1 = 1, f2 = 1, f3 = 1;
        for (int i = 3; i <= in; i++) {
            f3 = (f1 + f2) % 10007;
            f1 = f2;
            f2 = f3;
        }
        System.out.println(f3);
}

试题 入门训练 圆的面积 BEGIN-3

问题描述

给定圆的半径r,求圆的面积。

输入格式

输入包含一个整数r,表示圆的半径。

输出格式

输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积。

说明:在本题中,输入是一个整数,但是输出是一个实数。

对于实数输出的问题,请一定看清楚实数输出的要求,比如本题中要求保留小数点后7位,则你的程序必须严格的输出7位小数,输出过多或者过少的小数位数都是不行的,都会被认为错误。

实数输出的问题如果没有特别说明,舍入都是按四舍五入进行。

样例输入

4

样例输出

50.2654825

思路

直接算。

import java.math.*;
import java.util.*;
public static void Main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int r = scanner.nextInt();
        double out = Math.PI * r * r;
        System.out.println(String.format("%.7f", out));
}

试题 入门训练 序列求和 BEGIN-2

问题描述

求1+2+3+...+n的值。

输入格式

输入包括一个整数n。

输出格式

输出一行,包括一个整数,表示1+2+3+...+n的值。

样例输入

4

样例输出

10

思路

等差数列求和公式

[S_n=frac{n(a_1+a_n)}{2} ]

import java.math.*;
import java.util.*;
public static void Main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        long n = scanner.nextLong();
        long sum = n * (1 + n) / 2;
        System.out.println(sum);
}

试题 基础练习 十六进制转八进制 BASIC-12

问题描述

给定n个十六进制正整数,输出它们对应的八进制数。

输入格式

输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式

输出n行,每行为输入对应的八进制正整数。

【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。。

样例输入

2
39
123ABC

样例输出

71
4435274

思路

BigInterger 构造函数直接转。

import java.math.*;
import java.util.*;
public static void Main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        String[] inputs = new String[n + 1];
        for (int i = 0; i < n; i++) {
            inputs[i] = scanner.next();
        }

        for (int i = 0; i < n; i++) {
            String str = new BigInteger(inputs[i], 16).toString(8);
            System.out.println(str);
        }
}

试题 基础练习 十六进制转十进制 BASIC-11

问题描述

从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。

样例输入

FFFF

样例输出

65535

思路

根据各位的权重计算后加和

eg: FE[16] = E(14)* 16^0 + F(15)* 16^1 = 254[10]

import java.math.*;
import java.util.*;
public static void Main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String h = scanner.next();
        long number = 0;
        for (int i = 0; i < h.length(); i++) {
            int value = 0;
            char thisChar = h.charAt(h.length() - 1 - i);
            switch (thisChar) {
                case 'A':value = 10;break;
                case 'B':value = 11;break;
                case 'C':value = 12;break;
                case 'D':value = 13;break;
                case 'E':value = 14;break;
                case 'F':value = 15;break;
                default:
                    value = thisChar - '0';
            }
            number += value * Math.pow(16, i);
        }
        System.out.println(number);
}

试题 入门训练 十进制转十六进制 BASIC-10

问题描述

十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。

十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。

给出一个非负整数,将它表示成十六进制的形式。

输入格式

输入包含一个非负整数a,表示要转换的数。0<=a<=2147483647

输出格式

输出这个整数的16进制表示

样例输入

30

样例输出

1E

思路

从最低位开始 除16 余数转换成十六进制形式,商作为下一次计算的被除数,直到商为零为止,倒序合成成完整十六进制数。

import java.math.*;
import java.util.*;
public static void Main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int d = scanner.nextInt();
        StringBuilder stringBuilder = new StringBuilder();

        if (d == 0) {
            stringBuilder.append(0);
        }
        while (d != 0) {
            int value = d % 16;
            switch (value) {
                case 10:stringBuilder.append('A');break;
                case 11:stringBuilder.append('B');break;
                case 12:stringBuilder.append('C');break;
                case 13:stringBuilder.append('D');break;
                case 14:stringBuilder.append('E');break;
                case 15:stringBuilder.append('F');break;
                default:
                    stringBuilder.append(value);
            }
            d /= 16;
        }
        for (int i = stringBuilder.length() - 1; i >= 0; i--) {
            System.out.print(stringBuilder.charAt(i));
        }
}

试题 入门训练 特殊回文数 BASIC-9

问题描述

123321是一个非常特殊的数,它从左边读和从右边读是一样的。
输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。

输入格式

输入一行,包含一个正整数n

输出格式

按从小到大的顺序输出满足条件的整数,每个整数占一行。

样例输入

52

样例输出

899998
989989
998899

思路

折叠

先从原数字(左)上每次取一位,取三次(因为只需要5或6位的数字)

左侧每次取掉数字后 /10

去掉的数字*2 并加到sum中

右侧每次获得新数字,源右侧数字 *10 + 新数字

当 左侧<100 时,一定是五位数字,此时从sum中减去最后取的那个数字(五位数字最中间的数字只计算一次)

最后比较sum和n的值,及左右数字的值是否相等即可。

import java.math.*;
import java.util.*;
public static void Main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int number = 10000;
        while (number < 1000000) {
            int left = number;
            int right = 0;
            int sum = 0;
            for (int j = 0; j < 3; j++) {
                int value = left % 10;
                right = right * 10 + value;
                left /= 10;
                sum += value * 2;
                if (left < 100) {
                    sum -= value;
                    right /= 10;
                }
            }
            if (sum == n && left == right) {
                System.out.println(number);
            }
            number++;
        }
}

试题 入门训练 回文数 BASIC-8

问题描述

1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。

输出格式

 按从小到大的顺序输出满足条件的四位十进制数。

思路

上一题的简化,去除了数字和的限制。

import java.math.*;
import java.util.*;
public static void Main(String[] args) {
        int number = 1000;
        while (number < 10000) {
            int left = number;
            int right = 0;
            for (int j = 0; j < 2; j++) {
                int value = left % 10;
                right = right * 10 + value;
                left /= 10;
            }
            if (left == right) {
                System.out.println(number);
            }
            number++;
        }
}

试题 入门训练 特殊的数字 BASIC-7

问题描述

153是一个非常特殊的数,它等于它的每位数字的立方和,即153=111+555+333。编程求所有满足这种条件的三位十进制数。

输出格式

按从小到大的顺序输出满足条件的三位十进制数,每个数占一行。

思路

水仙花数。

import java.math.*;
import java.util.*;
public static void Main(String[] args) {
        int number = 100;
        while (number < 1000) {
            int sum = 0;
            int value = number;
            for (int i = 0; i < 3; i++) {
                sum += Math.pow(value % 10, 3);
                value /= 10;
            }
            if (number == sum) {
                System.out.println(number);
            }
            number++;
        }
}

试题 入门训练 杨辉三角形 BASIC-6

问题描述

杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。

它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。

下面给出了杨辉三角形的前4行:

1

1 1 

1 2 1

1 3 3 1

给出n,输出它的前n行。

输入格式

输入包括一个整数n。

输出格式

输出杨辉三角形的前n行。每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。请不要在前面输出多余的空格。

样例输入

4

样例输出

1
1 1
1 2 1
1 3 3 1

思路

二维数组按规定取值即可。

import java.math.*;
import java.util.*;
public static void Main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        List<List<Integer>> list = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            List<Integer> row = new ArrayList<>();
            for (int j = 0; j <= i; j++) {
                if (j == 0 || j == i) {
                    row.add(1);
                } else {
                    row.add(list.get(i - 1).get(j - 1) + list.get(i - 1).get(j));
                }
            }
            list.add(row);
        }
        for (List<Integer> integers : list) {
            for (Integer integer : integers) {
                System.out.print(integer + " ");
            }
            System.out.println();
        }
}

试题 入门训练 查找整数 BASIC-5

问题描述

给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。

输入格式

第一行包含一个整数n。

第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。

第三行包含一个整数a,为待查找的数。

输出格式

如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。

样例输入

6
1 9 4 8 3 9
9

样例输出

2

思路

直接找

import java.math.*;
import java.util.*;
public static void Main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        List<Integer> list = new LinkedList<>();
        int n = scanner.nextInt();
        for (int i = 0; i < n; i++) {
            list.add(scanner.nextInt());
        }
        int mezasu = scanner.nextInt();
        for (int i = 0; i < n; i++) {
            if (list.get(i) == mezasu) {
                System.out.print(i + 1);
                mezasu = -1;
                break;
            }
        }
        if (mezasu != -1) {
            System.out.print(-1);
        }
}

试题 入门训练 数列特征 BASIC-4

问题描述

给出n个数,找出这n个数的最大值,最小值,和。

输入格式

第一行为整数n,表示数的个数。

第二行有n个数,为给定的n个数,每个数的绝对值都小于10000。

输出格式

输出三行,每行一个整数。第一行表示这些数中的最大值,第二行表示这些数中的最小值,第三行表示这些数的和。

样例输入

5
1 3 -2 4 5

样例输出

5
-2
11

思路

直接比

import java.math.*;
import java.util.*;
public static void Main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int max = Integer.MIN_VALUE, min = Integer.MAX_VALUE, sum = 0;
        for (int i = 0; i < n; i++) {
            int value = scanner.nextInt();
            if (value > max) {
                max = value;
            }
            if (value < min) {
                min = value;
            }
            sum += value;
        }
        System.out.print(max + " 
" + min + " 
" + sum + " 
");
}

试题 入门训练 字母图形 BASIC-3

问题描述

利用字母可以组成一些美丽的图形,下面给出了一个例子:

ABCDEFG

BABCDEF

CBABCDE

DCBABCD

EDCBABC

这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。

输入格式

输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。

输出格式

输出n行,每个m个字符,为你的图形。

样例输入

5 7

样例输出

ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC

思路

看成ascii码来算。

import java.math.*;
import java.util.*;
public static void Main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int h = scanner.nextInt();
        int w = scanner.nextInt();
        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++) {
                if (j < i) {
                    System.out.print((char) (65 - j + i));
                } else {
                    System.out.print((char) (65 + j - i));
                }
            }
            System.out.println();
        }
}

试题 入门训练 01字串 BASIC-2

问题描述

对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:

00000

00001

00010

00011

00100

请按从小到大的顺序输出这32种01串。

输入格式

本试题没有输入。

输出格式

输出32行,按从小到大的顺序每行一个长度为5的01串。

样例输出

00000
00001
00010
00011
<以下部分省略>

思路

用BigInteger构造换进制,当成五位数二进制,最大31(十进制)。

最后格式化补零即可。

import java.math.*;
import java.util.*;
public static void Main(String[] args) {
        for (int i = 0; i < 32; i++) {
            String str = new BigInteger(String.valueOf(i), 10).toString(2);
            System.out.println(String.format("%05d", Integer.parseInt(str)));
        }
}
原文地址:https://www.cnblogs.com/eisuto/p/14202880.html