蓝桥杯Java试题汇总.docx
《蓝桥杯Java试题汇总.docx》由会员分享,可在线阅读,更多相关《蓝桥杯Java试题汇总.docx(47页珍藏版)》请在冰点文库上搜索。
蓝桥杯Java试题汇总
蓝桥杯Java试题汇总
LT
2.基础练习Sine之舞
时间限制:
1.0s内存限制:
512.0MB
问题描述
最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功。
所以他准备和奶牛们做一个“Sine之舞”的游戏,寓教于乐,提高奶牛们的计算能力。
不妨设
An=sin(1–sin(2+sin(3–sin(4+...sin(n))...)
Sn=(...(A1+n)A2+n-1)A3+...+2)An+1
FJ想让奶牛们计算Sn的值,请你帮助FJ打印出Sn的完整表达式,以方便奶牛们做题。
输入格式
仅有一个数:
N<201。
输出格式
请输出相应的表达式Sn,以一个换行符结束。
输出中不得含有多余的空格或换行、回车符。
样例输入
3
样例输出
((sin
(1)+3)sin(1–sin
(2))+2)sin(1–sin(2+sin(3)))+1
语言
JAVA
源代码
1importjava.util.Scanner;
2publicclassMain{
3privatestaticintm;
4publicstaticvoidmain(String[]args){
5Scannersc=newScanner(System.in);
6m=sc.nextInt();
7for(inti=0;i8System.out.print("(");
9}
10Sn
(1);
11}
12publicstaticvoidAn(intn,intk){
13if(n==k){
14System.out.print("sin("+n);
15}elseif(n%2!
=0){
16System.out.print("sin("+n+"-");
17}else{
18System.out.print("sin("+n+"+")
19;}
20if(n21An(n+1,k);
22System.out.print(")");
23}
24publicstaticvoidSn(intn){
25An(1,n);
26if(n!
=m){
27System.out.print("+"+(m-n+1)+")");
28}else{
29System.out.print("+"+(m-n+1));
30}
31if(n32
33Sn(n+1);
}}}
编译信息
无
3.基础练习FJ的字符串
时间限制:
1.0s内存限制:
512.0MB
问题描述
FJ在沙盘上写了这样一些字符串:
A1=“A”
A2=“ABA”
A3=“ABACABA”
A4=“ABACABADABACABA”
……
你能找出其中的规律并写所有的数列AN吗?
输入格式
仅有一个数:
N≤26。
输出格式
请输出相应的字符串AN,以一个换行符结束。
输出中不得含有多余的空格或换行、回车符。
样例输入
3
样例输出
ABACABA
言
JAVA
源代码
34importjava.util.Scanner;
35publicclassMain{
36publicstaticchar[]c={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O',
37'P','Q','R','S','T','U','V','W','X','Y','Z'};
38publicstaticvoidmain(String[]args){
39Scannerscan=newScanner(System.in);
40intn=scan.nextInt();
41print(n);}
42privatestaticvoidprint(intn){
43if(n==1){
44System.out.print("A");
45}
46else{
47print(n-1);
48System.out.print(c[n-1]);
print(n-1);}}}
4.基础练习芯片测试
时间限制:
1.0s内存限制:
512.0MB
问题描述
有n(2≤n≤20)块芯片,有好有坏,已知好芯片比坏芯片多。
每个芯片都能用来测试其他芯片。
用好芯片测试其他芯片时,能正确给出被测试芯片是好还是坏。
而用坏芯片测试其他芯片时,会随机给出好或是坏的测试结果(即此结果与被测试芯片实际的好坏无关)。
给出所有芯片的测试结果,问哪些芯片是好芯片。
输入格式
输入数据第一行为一个整数n,表示芯片个数。
第二行到第n+1行为n*n的一张表,每行n个数据。
表中的每个数据为0或1,在这n行中的第i行第j列(1≤i,j≤n)的数据表示用第i块芯片测试第j块芯片时得到的测试结果,1表示好,0表示坏,i=j时一律为1(并不表示该芯片对本身的测试结果。
芯片不能对本身进行测试)。
输出格式
按从小到大的顺序输出所有好芯片的编号
样例输入
3
101
010
101
样例输出
13
语言
JAVA
源代码
49importjava.util.*;
50publicclassMain{
51publicstaticvoidmain(String[]args){
52Scannersc=newScanner(System.in);
53intn=sc.nextInt();
54int[][]a=newint[n][n];
55for(inti=0;i56for(intk=0;k57a[i][k]=sc.nextInt();}
58
59
60}
61
62for(intk=0;k63intcount=0;
64for(inti=0;i65count+=a[i][k];
66}
67if(count>n/2){
68System.out.print((k+1)+"");}
69}
}}
5.基础练习龟兔赛跑预测
时间限制:
1.0s内存限制:
512.0MB
问题描述
话说这个世界上有各种各样的兔子和乌龟,但是研究发现,所有的兔子和乌龟都有一个共同的特点——喜欢赛跑。
于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感兴趣,于是决定研究不同兔子和乌龟的赛跑。
他发现,兔子虽然跑比乌龟快,但它们有众所周知的毛病——骄傲且懒惰,于是在与乌龟的比赛中,一旦任一秒结束后兔子发现自己领先t米或以上,它们就会停下来休息s秒。
对于不同的兔子,t,s的数值是不同的,但是所有的乌龟却是一致——它们不到终点决不停止。
然而有些比赛相当漫长,全程观看会耗费大量时间,而小华发现只要在每场比赛开始后记录下兔子和乌龟的数据——兔子的速度v1(表示每秒兔子能跑v1米),乌龟的速度v2,以及兔子对应的t,s值,以及赛道的长度l——就能预测出比赛的结果。
但是小华很懒,不想通过手工计算推测出比赛的结果,于是他找到了你——清华大学计算机系的高才生——请求帮助,请你写一个程序,对于输入的一场比赛的数据v1,v2,t,s,l,预测该场比赛的结果。
输入格式
输入只有一行,包含用空格隔开的五个正整数v1,v2,t,s,l,其中(v1,v2<=100;t<=300;s<=10;l<=10000且为v1,v2的公倍数)
输出格式
输出包含两行,第一行输出比赛结果——一个大写字母“T”或“R”或“D”,分别表示乌龟获胜,兔子获胜,或者两者同时到达终点。
第二行输出一个正整数,表示获胜者(或者双方同时)到达终点所耗费的时间(秒数)。
样例输入
1055220
样例输出
D
4
样例输入
1055120
样例输出
R
3
样例输入
1055320
样例输出
T
4
语言
JAVA
源代码
importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);intnum[]=newint[5];for(inti=0;i<5;i++)num[i]=sc.nextInt();intsum1=0,sum2=0,time=1;for(intt=1;t<=num[4]/num[0];time++){sum1+=num[0]*t;sum2+=num[1]*t;if(sum1==num[4]||sum2==num[4])break;if(sum1-sum2>=num[2]){sum2+=num[1]*num[3];time+=num[3];}}if(sum2>sum1){System.out.println("T");System.out.println(num[4]/num[1]);}elseif(sum26.
基础练习报时助手
时间限制:
1.0s内存限制:
512.0MB
问题描述
给定当前的时间,请用英文的读法将它读出来。
时间用时h和分m表示,在英文的读法中,读一个时间的方法是:
如果m为0,则将时读出来,然后加上“o'clock”,如3:
00读作“threeo'clock”。
如果m不为0,则将时读出来,然后将分读出来,如5:
30读作“fivethirty”。
时和分的读法使用的是英文数字的读法,其中0~20读作:
0:
zero,1:
one,2:
two,3:
three,4:
four,5:
five,6:
six,7:
seven,8:
eight,9:
nine,10:
ten,11:
eleven,12:
twelve,13:
thirteen,14:
fourteen,15:
fifteen,16:
sixteen,17:
seventeen,18:
eighteen,19:
nineteen,20:
twenty。
30读作thirty,40读作forty,50读作fifty。
对于大于20小于60的数字,首先读整十的数,然后再加上个位数。
如31首先读30再加1的读法,读作“thirtyone”。
按上面的规则21:
54读作“twentyonefiftyfour”,9:
07读作“nineseven”,0:
15读作“zerofifteen”。
输入格式
输入包含两个非负整数h和m,表示时间的时和分。
非零的数字前没有前导0。
h小于24,m小于60。
输出格式
输出时间时刻的英文。
样例输入
015
样例输出
zerofifteen
70importjava.util.Scanner;
71publicclassMain{
72publicstaticString[]time1={"zero","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen","twenty"};
73publicstaticString[]time2={"twenty","thirty","forty","fifty"};
74publicstaticvoidmain(String[]args){
75Scannersc=newScanner(System.in);
76while(sc.hasNext()){
77inth=sc.nextInt();
78intm=sc.nextInt();
79if(h<=20){
80System.out.print(time1[h]);
81}else{
82System.out.print("twenty"+""+time1[h-20]);
83}if(m==0){
84System.out.println(""+"o'clock");
85}else{if(m<20){
86System.out.print(""+time1[m]);
87}else{
88inta=m/10;//十位
89intb=m%10;//个位
90if(b==0)
91System.out.print(""+time2[a-2]);
92else
93System.out.print(""+time2[a-2]+""+time1[b]);
94}
95}
96System.out.println();
97}
98}
99
100
101}
7.基础练习Huffuman树
时间限制:
1.0s内存限制:
512.0MB
问题描述
Huffman树在编码中有着广泛的应用。
在这里,我们只关心Huffman树的构造过程。
给出一列数{pi}={p0,p1,…,pn-1},用这列数构造Huffman树的过程如下:
1.找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中。
这个过程的费用记为pa+pb。
2.重复步骤1,直到{pi}中只剩下一个数。
在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用。
本题任务:
对于给定的一个数列,现在请你求出用该数列构造Huffman树的总费用。
例如,对于数列{pi}={5,3,8,2,9},Huffman树的构造过程如下:
1.找到{5,3,8,2,9}中最小的两个数,分别是2和3,从{pi}中删除它们并将和5加入,得到{5,8,9,5},费用为5。
2.找到{5,8,9,5}中最小的两个数,分别是5和5,从{pi}中删除它们并将和10加入,得到{8,9,10},费用为10。
3.找到{8,9,10}中最小的两个数,分别是8和9,从{pi}中删除它们并将和17加入,得到{10,17},费用为17。
4.找到{10,17}中最小的两个数,分别是10和17,从{pi}中删除它们并将和27加入,得到{27},费用为27。
5.现在,数列中只剩下一个数27,构造过程结束,总费用为5+10+17+27=59。
输入格式
输入的第一行包含一个正整数n(n<=100)。
接下来是n个正整数,表示p0,p1,…,pn-1,每个数不超过1000。
输出格式
输出用这些数构造Huffman树的总费用。
样例输入
5
53829
样例输出
59
语言
JAVA
源代码
102importjava.util.*;
103publicclassMain{
104publicstaticvoidmain(Stringargs[]){
105Scannersc=newScanner(System.in);
106while(sc.hasNext()){
107intn=sc.nextInt();
108int[]a=newint[n];
109for(inti=0;i110a[i]=sc.nextInt();}
111
112intk=0;
113intsum=0;
114while(n>1){
115Arrays.sort(a);
116k=a[0]+a[1];
117sum=sum+k;
118a[0]=k;
119a[1]=Integer.MAX_VALUE;
120n--;
121
122}
123System.out.print(sum);
124}
125}
}
8.基础练习高精度加法
时间限制:
1.0s内存限制:
512.0MB
问题描述
输入两个整数a和b,输出这两个整数的和。
a和b都不超过100位。
算法描述
由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。
对于这种问题,一般使用数组来处理。
定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。
同样可以用一个数组B来存储b。
计算c=a+b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r,把和的个位数存入C[0],即C[0]等于(A[0]+B[0])%10。
然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果又有进位产生,则仍可将新的进位存入到r中,和的个位存到C[1]中。
依此类推,即可求出C的所有位。
最后将C输出即可。
输入格式
输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。
两个整数都不超过100位,两数的最高位都不是0。
输出格式
输出一行,表示a+b的值。
样例输入
20100122201001221234567890
2010012220100122
样例输出
20100122203011233454668012
语言
JAVA
源代码
126importjava.util.*;
127importjava.math.*;
128publicclassMain{
129publicstaticvoidmain(Stringargs[]){
130Scannersc=newScanner(System.in);
131while(sc.hasNext()){
132Strings1=sc.next();
133Strings2=sc.next();
134BigIntegern1=newBigInteger(s1);
135BigIntegern2=newBigInteger(s2);
136System.out.println(n1.add(n2));
137}
138
139}
}
9.问题描述
输入一个正整数n,输出n!
的值。
其中n!
=1*2*3*…*n。
算法描述
n!
可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。
使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。
将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!
的值。
输入格式
输入包含一个正整数n,n<=1000。
输出格式
输出n!
的准确值。
样例输入
10
样例输出
3628800
JAVA
源代码
140importjava.util.Arrays;
141importjava.util.Scanner;
142publicclassMain{
143staticintmax=10000;
144publicstaticvoidmain(String[]args){
145intA[]=newint[max];
146Scannerinput=newScanner(System.in);
147intn=input.nextInt();
148A[0]=1;
149intcount=0;
150for(inti=1;i<=n;i++){
151intge=0,sum;
152for(intj=0;j<=count;j++){
153if((i*A[j]+ge)/10!
=0){
154sum=A[j]*i+ge;
155A[j]=sum%10;
156ge=sum/10;
157if(j==count){
158count++;
159continue;
160}
161}
162else{
163A[j]=i*A[j]+ge;
164ge=0;
165}
166}
167}
168
169for(inti=count;i>=0;i--){
170System.out.print(A[i]);
171}}}
10.基础练习数列排序
时间限制:
1.0s内存限制:
512.0MB
问题描述
给定一个长度为n的数列,将这个数列按从小到大的顺序排列。
1<=n<=200
输入格式
第一行为一个整数n。
第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。
输出格式
输出一行,按从小到大的顺序输出排序后的数列。
样例输入
5
83649
样例输出
34689
语言
JAVA
源代码
172importjava.util.*;
173publicclassMain{
174publicstaticvoidmain(String[]args){
175Scannersc=newScanner(System.in);
176intn=sc.nextInt();
177int[]a=newint[n];
178while(sc.hasNextInt()){
179
180for(inti=0;i181a[i]=sc.nextInt();
182Arrays.sort(a);
183for(inti=0;i184System.out.print(a[i]+"");
185System.out.println();
186