蓝桥杯 官方练习题 (入门+基础 )
练习 Day1
- 蓝桥杯 官方练习题 (入门+基础 )
- 试题 入门训练 Fibonacci数列 BEGIN-4
- 试题 入门训练 圆的面积 BEGIN-3
- 试题 入门训练 序列求和 BEGIN-2
- 试题 基础练习 十六进制转八进制 BASIC-12
- 试题 基础练习 十六进制转十进制 BASIC-11
- 试题 入门训练 十进制转十六进制 BASIC-10
- 试题 入门训练 特殊回文数 BASIC-9
- 试题 入门训练 回文数 BASIC-8
- 试题 入门训练 特殊的数字 BASIC-7
- 试题 入门训练 杨辉三角形 BASIC-6
- 试题 入门训练 查找整数 BASIC-5
- 试题 入门训练 数列特征 BASIC-4
- 试题 入门训练 字母图形 BASIC-3
- 试题 入门训练 01字串 BASIC-2
试题 入门训练 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
思路
等差数列求和公式
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)));
}
}