JavaC组蓝桥杯107道历年真题
2013年JavaC组————蓝桥杯第四届
猜年龄暴⼒法 or Set集合
【问题描述】美国数学家维纳(N.Wiener)智⼒早熟,11岁就上了⼤学。他曾在1935~1936年应邀来中国清华⼤学讲学。⼀次,他参加某个重要会议,年轻的脸孔引⼈注⽬。于是有⼈询问他的年龄,他回答说: “我年龄的⽴⽅是个4位数。我年龄的4次⽅是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。” 请你推算⼀下,他当时到底有多年轻。
通过浏览器,直接提交他那时的年龄数字。
注意:不要提交解答过程,或其它的说明⽂字。
【答案】18
【暴⼒法代码】
public static void main(String[] args) {
for (int age = 11; age < 20; age++) {
System.out.println("年龄"+age+":"+Math.pow(age, 3) +" "+ Math.pow(age, 4));
}
}
【输出】
年龄11:1331.0 14641.0
年龄12:1728.0 20736.0
年龄13:2197.0 28561.0
年龄14:2744.0 38416.0
年龄15:3375.0 50625.0
年龄16:4096.0 65536.0
年龄17:4913.0 83521.0
年龄18:5832.0 104976.0
年龄19:6859.0 130321.0
【Set集合代码】
public static void main(String[] args) {
for(int i=10;i<100;i++) {
int i1=i*i*i;
int i2=i1*i;
String s1 = i1+"";
String s2 = i2+"";
if(s1.length()==4&&s2.length()==6&&Check(s1+s2)) {
System.out.println(i);
break;
}
}
}
public static boolean Check(String s) {
Set<Character> set=new HashSet<Character>(); // 不允许出现重复元素
for(int i=0;i<s.length();i++) {
set.add(s.charAt(i));
}
return set.size()==10; // 等于10 正好0~9都存⼊Set集合中
}
组元素暴⼒法or递归全排列
【问题描述】素数就是不能再进⾏等分的数。⽐如:2 3 5 7 11 等。9 = 3 * 3 说明它可以3等分,因⽽不是素数。
我们国家在1949年建国。如果只给你 1 9 4 9 这4个数字卡⽚,可以随意摆放它们的先后顺序(但卡⽚不能倒着摆放啊,我们不是在脑筋急转弯!),那么,你能组成多少个4位的素数呢?
⽐如:1949,4919 都符合要求。
【答案】6
【暴⼒法代码】
public static boolean isPrime(int num) { // 判断是否为素数
if (num == 1 || num % 2 == 0 && num != 2) {
return false;
} else {
for (int i = 3; i < Math.sqrt(num); i += 2) {
if (num % i == 0) {
return false;
}
}
}
return true;
}
public static void main(String[] args) {
//暴⼒破解
int[] a = new int[] {1949,1499,1994,9149,9194,9491,9419,9914,9941,4199,4919,4991}; // ⼿动全排列
int count = 0;
for(int i:a) {
if(isPrime(i)) {
count++;
}
}
System.out.println(count);
【递归全排列代码】
public static Set<Integer> set; // ⽤set集合排除两个9交换的特殊情况
public static void main(String[] args) {
int a[] = { 1, 9, 4, 9 };
set = new HashSet<Integer>();
perm(a,0,3);
System.out.println(set.size());
}
public static void perm(int a[], int start, int end) { // 递归全排列
if (start == end) {
String str = "";
for (int j = 0; j < a.length; j++) {
str = str + a[j];
}
isPrime(Integer.valueOf(str));
} else {
for (int i = start; i <= end; i++) {
swap(a, start, i);
perm(a, start + 1, end);
swap(a, start, i);
}
}
}
public static void swap(int a[], int i, int j) { // 交换
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
public static boolean isPrime(int num) { // 判断是否为素数
if (num == 1 || num % 2 == 0 && num != 2) {
return false;
} else {
for (int i = 3; i <= Math.sqrt(num); i += 2) {
if (num % i == 0) {
return false;
}
}
}
set.add(num);
return true;
}
马虎的算式暴⼒法or递归全排列法
【问题描述】
⼩明是个急性⼦,上⼩学的时候经常把⽼师写在⿊板上的题⽬抄错了。
有⼀次,⽼师出的题⽬是:36 x 495 = ?
他却给抄成了:396 x 45 = ?
但结果却很戏剧性,他的答案竟然是对的!!
因为 36 * 495 = 396 * 45 = 17820
类似这样的巧合情况可能还有很多,⽐如:27 * 594 = 297 * 54
假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)
能满⾜形如: ab * cde = adb * ce 这样的算式⼀共有多少种呢?
请你利⽤计算机的优势寻所有的可能,并回答不同算式的种类数。
满⾜乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。
答案直接通过浏览器提交。
注意:只提交⼀个表⽰最终统计种类数的数字,不要提交解答过程或其它多余的内容。【答案】142
【暴⼒破解法】 for循环套的有点迷
public static void main(String[] args) {
int count = 0;
for(int a=1;a<=9;a++) {
for(int b=1;b<=9;b++) {
if(b==a)
continue;
for(int c=1;c<=9;c++) {
if(c==a||c==b)
continue;
for(int d=1;d<=9;d++) {
if(d==a||d==b||d==c) {
continue;
}
for(int e=1;e<=9;e++) {
if(e==a||e==b||e==c||e==d) {
continue;
}
if ((10*a+b)*(100*c+10*d+e)==(100*a+10*d+b)*(10*c+e)) {
count++;
}
}
}
}
}
System.out.println(count);//142
}
【递归全排列法】解法和上⼀题差不多
public static Set<String> set; // 算式的个数
public static void main(String[] args) {
int a[] = {1,2,3,4,5,6,7,8,9};
set = new HashSet<String>();
perm(a,0,8);
System.out.println(set.size());
}
public static void perm(int a[], int start, int end) { // 递归全排列
if (start == end) {
fun(a[0],a[1],a[2],a[3],a[4]);
} else {
for (int i = start; i <= end; i++) {
swap(a, start, i);c和java先学哪个
perm(a, start + 1, end);
swap(a, start, i);
}
}
}
public static void swap(int a[], int i, int j) { // 交换
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
public static void fun(int a,int b,int c,int d,int e) {
if((a*10+b)*(c*100+d*10+e)==(a*100+d*10+b)*(c*10+e)) {
set.add(""+a+b+c+d+e);
}
}
第39级台阶递归(dfs深搜)
【问题描述】
⼩明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!
站在台阶前,他突然⼜想着⼀个问题:
如果我每⼀步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后⼀步是迈右脚,也就是说⼀共要⾛偶数步。那么,上完39级台阶,有多少种不同的上法呢?请你利⽤计算机的优势,帮助⼩明寻答案。
要求提交的是⼀个整数。
注意:不要提交解答过程,或其它的辅助说明⽂字。
【答案】51167078
【代码】
public static void main(String[] args) {
System.out.println(f(0));//51167078
}
public static int f(int x) {
if(x==39) { //
return 1;
}
if(x>39) // 抛弃
return 0;
return f(x+2)+2*f(x+3)+f(x+4); //1步
}
// (左脚右脚) (左脚右脚) ........ (左脚右脚)->39
// ⼀个组合可能有四种⾛法 2步 3步 3步 4步
// 抛弃⼤于39
/
/ 得到正好⾛到39
有理数类
【问题描述】
有理数就是可以表⽰为两个整数的⽐值的数字。⼀般情况下,我们⽤近似的⼩数表⽰。但有些时候,不允许出现误差,必须⽤两个整数来表⽰⼀个有理数。
这时,我们可以建⽴⼀个“有理数类”,下⾯的代码初步实现了这个⽬标。为了简明,它只提供了加法和乘法运算。
class Rational
{
private long ra;
private long rb;
private long gcd(long a, long b){
if(b==0) return a;
return gcd(b,a%b);
}
public Rational(long a, long b){
ra = a;
long k = gcd(ra,rb);
if(k>1){ //需要约分
ra /= k;
rb /= k;
}
}
/
/ 加法
public Rational add(Rational x){
return ________________________________________; //填空位置
}
// 乘法
public Rational mul(Rational x){
return new Rational(ra*x.ra, rb*x.rb);
}
public String toString(){
if(rb==1) return "" + ra;
return ra + "/" + rb;
}
}
使⽤该类的⽰例:
Rational a = new Rational(1,3);
Rational b = new Rational(1,6);
Rational c = a.add(b);
System.out.println(a + "+" + b + "=" + c);
请分析代码逻辑,并推测划线处的代码,通过⽹页提交
注意:仅把缺少的代码作为答案,千万不要填写多余的代码、符号或说明⽂字!!
【答案】new Rational(ra x.rb+x.ra rb,rb*x.rb)
参照乘法
逆波兰表达式
【问题描述】
正常的表达式称为中缀表达式,运算符在中间,主要是给⼈阅读的,机器求解并不⽅便。
例如:3 + 5 * (2 + 6) - 1
⽽且,常常需要⽤括号来改变运算次序。
相反,如果使⽤逆波兰表达式(前缀表达式)表⽰,上⾯的算式则表⽰为:
- + 3 * 5 + 2 6 1
不再需要括号,机器可以⽤递归的⽅法很⽅便地求解。
为了简便,我们假设:
1. 只有 + - * 三种运算符
2. 每个运算数都是⼀个⼩于10的⾮负整数
下⾯的程序对⼀个逆波兰表⽰串进⾏求值。
其返回值为⼀个数组:其中第⼀元素表⽰求值结果,第⼆个元素表⽰它已解析的字符数。
static int[] evaluate(String x)
{
if(x.length()==0) return new int[] {0,0};
char c = x.charAt(0);
if(c>='0' && c<='9') return new int[] {c-'0',1};
int[] v1 = evaluate(x.substring(1));
int[] v2 = __________________________________________; //填空位置
int v = Integer.MAX_VALUE;
if(c=='+') v = v1[0] + v2[0];
if(c=='*') v = v1[0] * v2[0];
if(c=='-') v = v1[0] - v2[0];
return new int[] {v,1+v1[1]+v2[1]};
}
请分析代码逻辑,并推测划线处的代码,通过⽹页提交。
注意:仅把缺少的代码作为答案,千万不要填写多余的代码、符号或说明⽂字!!
【答案】 evaluate(x.substring(v1[1]+1))
核桃的数量最⼩公倍数
【问题描述】
⼩张是软件项⽬经理,他带领3个开发组。⼯期紧,今天都在加班呢。为⿎舞⼠⽓,⼩张打算给每个组发⼀袋核桃(据传⾔能补脑)。他的要求是:
1. 各组的核桃数量必须相同
2. 各组内必须能平分核桃(当然是不能打碎的)
3. 尽量提供满⾜1,2条件的最⼩数量(节约闹⾰命嘛)
程序从标准输⼊读⼊:
a b c
a,b,c都是正整数,表⽰每个组正在加班的⼈数,⽤空格分开(a,b,c<30)
程序输出:
⼀个正整数,表⽰每袋核桃的数量。
例如:
⽤户输⼊:
2 4 5
程序输出:
20
再例如:
⽤户输⼊:
3 1 1
程序输出:
3
资源约定:
峰值内存消耗(含虚拟机) < 64M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添⾜地打印类似:“请您输⼊...” 的多余内容。
所有代码放在同⼀个源⽂件中,调试通过后,拷贝提交该源码。
注意:不要使⽤package语句。不要使⽤jdk1.6及以上版本的特性。
注意:主类的名字必须是:Main,否则按⽆效代码处理。
【代码】
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int a = Int();
int b = Int();
int c = Int();
for(int i=1;i<=a*b*c;i++) {
if(i%a==0&&i%b==0&&i%c==0) {
System.out.println(i);
break;
}
}
}
打印⼗字图递归重拟矩阵坐标系
【问题描述】
⼩明为某机构设计了⼀个⼗字型的徽标(并⾮红⼗字会啊),如下所⽰(可参见p1.jpg) $$$$$$$$$$$$$
$ $
$$$ $$$$$$$$$ $$$
$ $ $ $
$ $$$ $$$$$ $$$ $
$ $ $ $ $ $
$ $ $$$ $ $$$ $ $
$ $ $ $ $ $ $
$ $ $ $$$$$ $ $ $
$ $ $ $ $ $ $
$ $ $$$ $ $$$ $ $
$ $ $ $ $ $
$ $$$ $$$$$ $$$ $
$ $ $ $
$$$ $$$$$$$$$ $$$
$ $
$$$$$$$$$$$$$
对⽅同时也需要在电脑dos窗⼝中以字符的形式输出该标志,并能任意控制层数。
为了能准确⽐对空⽩的数量,程序要求对⾏中的空⽩以句点(.)代替。
输⼊格式:
⼀个正整数 n (n<30) 表⽰要求打印图形的层数
输出:
对应包围层数的该标志。
例如:
⽤户输⼊:
1
程序应该输出:
.
.$$$$$..
..$...$..
$$$.$.$$$
$...$...$
$.$$$$$.$
$...$...$
$$$.$.$$$
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论