蓝桥杯2012预赛java高职题分析

java高职题1


    造成高房价的原因有许多,比如土地出让价格。既然地价高,土地的面积必须仔细计算。遗憾的是,有些地块的形状不规则,比如是如图【1.jpg】中所示的五边形。


    一般需要把它划分为多个三角形来计算。


    已知三边求三角形的面积需要用海伦定理,参见【2.jpg】


    各条边长数据如下:
    AB = 52.1
    BC = 57.2
    CD = 43.5
    DE = 51.9
    EA = 33.4
    EB = 68.2
    EC = 71.9


该题太简单,不做分析

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    double s_ABE = (52.1 + 68.2 + 33.4) / 2;
    double s_BEC = (68.2 + 57.2 + 71.9) / 2;
    double s_EDC = (71.9 + 51.9 + 43.5) / 2;

    double A_ABE = sqrt(s_ABE * (s_ABE - 52.1) * (s_ABE - 33.4) * (s_ABE - 68.2));
    double A_BEC = sqrt(s_BEC * (s_BEC - 68.2) * (s_BEC - 57.2) * (s_BEC - 71.9));
    double A_EDC = sqrt(s_EDC * (s_EDC - 71.9) * (s_EDC - 43.5) * (s_EDC - 51.9));

    cout << A_EDC + A_BEC + A_ABE << endl;
    return 0;
}


java高职题2



    今年的植树节(2012年3月12日),小明和他的叔叔还有小伙伴们一起去植树。休息的时候,小明的同学问他叔叔多大年纪,他叔叔说:“我说个题目,看你们谁先猜出来!”


    “把我出生的年月日连起来拼成一个8位数(月、日不足两位前补0)正好可以被今天的年、月、日整除!”


    他想了想,又补充到:“再给个提示,我是6月出生的。”


    根据这些信息,请你帮小明算一下,他叔叔的出生年月日。


    答案写在“解答.txt”中,不要写在这里!


    格式是年月日连成的8位数。
    例如,如果是1948年6月12日,就写:19480612


#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    for (int y = 1900;y < 2012;y++)
    {
        for (int d = 1; d < 31;d++)
        {
            int val = y * 10000 + 6 * 100 + d;
            if (val % 2012 != 0 || val % 3 != 0 || val % 12 != 0 )
            {
                continue;
            }
            cout << y << "06" << setw(2) << setfill('0') << d << endl;
            /*ans:19550604*/
        }
    }
    return 0;
}


java高职题3




    你一定听说过这个故事。国王对发明国际象棋的大臣很佩服,问他要什么报酬,大臣说:请在第1个棋盘格放1粒麦子,在第2个棋盘格放2粒麦子,在第3个棋盘格放4粒麦子,在第4个棋盘格放8粒麦子,......后一格的数字是前一格的两倍,直到放完所有棋盘格(国际象棋共有64格)。


    国王以为他只是想要一袋麦子而已,哈哈大笑。


    当时的条件下无法准确计算,但估算结果令人吃惊:即使全世界都铺满麦子也不够用!


    请你借助计算机准确地计算,到底需要多少粒麦子。


    答案写在“解答.txt”中,不要写在这里!


val = [2 ** i for i in range(65)]
sum = 0
for every in val:
	sum += every
print(sum)
# ans:36893488147419103231

java高职题4

  有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。


    等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”


    请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。


    如果有多个可能的答案,请列出所有答案,每个答案占一行。


    格式是:人数,人数,...


    例如,有一种可能是:20,5,4,2,0


    答案写在“解答.txt”中,不要写在这里!


这个题本科预赛题里面也有,我在考场上用的是四个for循环,觉得这样挺好

分析 的 1/a + 1/b + 1/c + 1/d = 1 (a > b > c > d)

化简得

bcd + acd + abd + abc = abcd

程序如下

for a in range(1,21):
	for b in range(1,a):
		for c in range(1,b):
			for d in range(1,c):
				if b * c * d + a * c * d + a * b * d + a * b * c == a * b * c * d:
					print(a,b,c,d,'0')
# ans:
# 12 6 4 2
# 15 10 3 2
# 18 9 3 2
# 20 5 4 2
# 

java高职题5

以下的静态方法实现了:把串s中第一个出现的数字的值返回。
如果找不到数字,返回-1
例如:
s = "abc24us43"  则返回2
s = "82445adb5"  则返回8
s = "ab"   则返回-1   


public static int getFirstNum(String s)
{
if(s==null || s.length()==0) return -1;

char c = s.charAt(0);
if(c>='0' && c<='9') return _____________;  //填空

return getFirstNum(______________);  //填空
}


请分析代码逻辑,并推测划线处的代码。


答案写在 “解答.txt” 文件中


注意:只写划线处应该填的内容,划线前后的内容不要抄写。

public class j_g_4{
	public static void main(String[] args){
		String s = "abc24us43";
		int a = getFirstNum(s);
		System.out.println(a);

		s = "82445adb";
		a = getFirstNum(s);
		System.out.println(a);

		s = "ab";
		a = getFirstNum(s);
		System.out.println(a);
	}
	public static int getFirstNum(String s)
	{
	if(s==null || s.length()==0) return -1;

	char c = s.charAt(0);
	if(c>='0' && c<='9') return c - '0';  //填空

	return getFirstNum(s.substring(1));  //填空
	}
}
java高职题6
下面代码模拟了一套扑克牌(初始排序A~K,共13张)的操作过程。


操作过程是:
手里拿着这套扑克牌,从前面拿一张放在后面,再从前面拿一张放桌子上,再从前面拿一张放在后面,....
如此循环操作,直到剩下最后一张牌也放在桌子上。


下面代码的目的就是为了求出最后桌上的牌的顺序。


初始的排列如果是A,2,3...K,则最后桌上的顺序为:
[2, 4, 6, 8, 10, Q, A, 5, 9, K, 7, 3, J]


import java.util.*;
public class A23
{
public static List moveCard(List src)
{
if(src==null) return null;

List dst = new Vector();
for(;;)
{
if(__________________) break;  // 填空
src.add(src.remove(0));
dst.add(__________________);  // 填空
}

return dst;
}

public static void main(String[] args)
{
List a = new Vector();
a.addAll(Arrays.asList("A","2","3","4","5","6","7","8","9","10","J","Q","K"));
System.out.println(moveCard(a));
}
}




请分析代码逻辑,并推测划线处的代码。


答案写在 “解答.txt” 文件中


注意:只写划线处应该填的内容,划线前后的内容不要抄写。


由于我对java不甚精通,该题未作出,留给读者自己吧,下面是未完成的代码

import java.util.*;

public class j_g_6
{
	public static List moveCard(List src)
	{
		if(src==null) return null;

		List dst = new Vector();
		for(;;)
		{
			if(src == null) break;  // 填空
			src.add(src.remove(0));
			dst.add(src.remove(0));  // 填空
		}

		return dst;
	}

	public static void main(String[] args)
	{
		List a = new Vector();
		a.addAll(Arrays.asList("A","2","3","4","5","6","7","8","9","10","J","Q","K"));
		System.out.println(moveCard(a));
	}
}
java高职题7


下面的代码用于判断一个串中的括号是否匹配
所谓匹配是指不同类型的括号必须左右呼应,可以相互包含,但不能交叉


例如:
..(..[..]..)..  是允许的
..(...[...)....].... 是禁止的 
对于 main 方法中的测试用例,应该输出:
false
true
false
false


import java.util.*;
public class A22
{
public static boolean isGoodBracket(String s)
{
Stack<Character> a = new Stack<Character>();

for(int i=0; i<s.length(); i++)
{
char c = s.charAt(i);
if(c=='(') a.push(')');
if(c=='[') a.push(']');
if(c=='{') a.push('}');

if(c==')' || c==']' || c=='}')
{
if(____________________) return false;    // 填空
if(a.pop() != c) return false;
}
}

if(___________________) return false;  // 填空

return true;
}

public static void main(String[] args)
{
System.out.println( isGoodBracket("...(..[.)..].{.(..).}..."));
System.out.println( isGoodBracket("...(..[...].(.).){.(..).}..."));
System.out.println( isGoodBracket(".....[...].(.).){.(..).}..."));
System.out.println( isGoodBracket("...(..[...].(.).){.(..)...."));
}
}

请分析代码逻辑,并推测划线处的代码。


答案写在 “解答.txt” 文件中


注意:只写划线处应该填的内容,划线前后的内容不要抄写。
又是个填空题,弃之,我不擅长java


java高职题8



    30年的改革开放,给中国带来了翻天覆地的变化。2011全年中国手机产量约为11.72亿部。手机已经成为百姓的基本日用品!


    给手机选个好听又好记的号码可能是许多人的心愿。但号源有限,只能辅以有偿选号的方法了。


    这个程序的目的就是:根据给定的手机尾号(4位),按照一定的规则来打分。其规则如下:


    1. 如果出现连号,不管升序还是降序,都加5分。例如:5678,4321都满足加分标准。


    2. 前三个数字相同,或后三个数字相同,都加3分。例如:4888,6665,7777都满足加分的标准。注意:7777因为满足这条标准两次,所以这条规则给它加了6分。


    3. 符合AABB或者ABAB模式的加1分。例如:2255,3939,7777都符合这个模式,所以都被加分。注意:7777因为满足这条标准两次,所以这条标准给它加了2分。


    4. 含有:6,8,9中任何一个数字,每出现一次加1分。例如4326,6875,9918都符合加分标准。其中,6875被加2分;9918被加3分。


    尾号最终得分就是每条标准的加分总和!


    要求程序从标准输入接收数据,在标准输出上输出结果。


    输入格式为:第一行是一个整数n(<100),表示下边有多少输入行,接下来是n行4位一组的数据,就是等待计算加分的手机尾号。
    输出格式为:n行整数。


    例如,输入:
14
3045
0211
2345
6543
7777
8888
7878
7788
6688
2424
2244
9918
6789
8866
    则输出:
0
0
5
6
8
12
3
3
5
1
1
3
8
5


    注意:


    请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!
    
    在评卷时使用的输入数据与试卷中给出的实例数据可能是不同的。


    请把所有类写在同一个文件中,调试好后,存入与【考生文件夹】下对应题号的“解答.txt”中即可。
    
    相关的工程文件不要拷入。
    
    请不要使用package语句。
    
    源程序中只能出现JDK1.5中允许的语法或调用。不能使用1.6或更高版本。

#include <iostream>
#include <string>

using namespace std;

int case_1_score(string& str)
{
    int debth = str[1] - str[0];
    if (debth == 0)
    {
        return 0;
    }

    for (int i = 1;i < str.size();i++)
    {
        if (str[i] - str[i - 1] != debth)
        {
            return 0;
        }
    }
    return 5;
}
int case_2_score(string& str)
{
    int score = 0;
    if (str[0] == str[1] && str[1] == str[2])
    {
        score += 3;
    }
    if (str[3] == str[1] && str[1] == str[2])
    {
        score += 3;
    }
    return score;
}
int case_3_score(string& str)
{
    int score = 0;
    if (str[0] == str[1] && str[2] == str[3])
    {
        score += 1;
    }
    if (str[0] == str[2] && str[1] == str[3])
    {
        score += 1;
    }
    return score;
}
int case_4_score(string& str)
{
    int score = 0;
    for (int i = 0;i < str.size();i++)
    {
        if (str[i] == 9 + '0' || str[i] == 8 + '0' || str[i] == 6 + '0')
        {
            score += 1;
        }
    }
    return score;
}

int main()
{
    freopen("j_g_8.txt","r",stdin);
    int n = 0;
    cin >> n;
    string str;
    for (int i = 0;i < n;i++)
    {
        cin >> str;
        int score = 0;
        score += case_1_score(str);
        score += case_2_score(str);
        score += case_3_score(str);
        score += case_4_score(str);
        cout << score << endl;
    }

    return 0;
}

java高职题9



    在对银行账户等重要权限设置密码的时候,我们常常遇到这样的烦恼:如果为了好记用生日吧,容易被破解,不安全;如果设置不好记的密码,又担心自己也会忘记;如果写在纸上,担心纸张被别人发现或弄丢了...


    这个程序的任务就是把一串拼音字母转换为6位数字(密码)。我们可以使用任何好记的拼音串(比如名字,王喜明,就写:wangximing)作为输入,程序输出6位数字。


    变换的过程如下:


    第一步. 把字符串6个一组折叠起来,比如wangximing则变为:
    wangxi
    ming 


    第二步. 把所有垂直在同一个位置的字符的ascii码值相加,得出6个数字,如上面的例子,则得出:
    228 202 220 206 120 105


    第三步. 再把每个数字“缩位”处理:就是把每个位的数字相加,得出的数字如果不是一位数字,就再缩位,直到变成一位数字为止。例如: 228 => 2+2+8=12 => 1+2=3


    上面的数字缩位后变为:344836, 这就是程序最终的输出结果!


    要求程序从标准输入接收数据,在标准输出上输出结果。


    输入格式为:第一行是一个整数n(<100),表示下边有多少输入行,接下来是n行字符串,就是等待变换的字符串。
    输出格式为:n行变换后的6位密码。


    例如,输入:
5
zhangfeng
wangximing
jiujingfazi
woaibeijingtiananmen
haohaoxuexi


    则输出:
772243
344836
297332
716652
875843


    注意:


    请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!
    
    在评卷时使用的输入数据与试卷中给出的实例数据可能是不同的。


    请把所有类写在同一个文件中,调试好后,存入与【考生文件夹】下对应题号的“解答.txt”中即可。
    
    相关的工程文件不要拷入。
    
    请不要使用package语句。
    
    源程序中只能出现JDK1.5中允许的语法或调用。不能使用1.6或更高版本。

该题做过的次数可真多了,这是本科c组的第一道大题,因为做过,考场上没花多少时间,参考POJ 1519做吧,很简单,注意(x + 8) % 9 + 1这个公式即可


java高职题10


    匪警请拨110,即使手机欠费也可拨通!


    为了保障社会秩序,保护人民群众生命财产安全,警察叔叔需要与罪犯斗智斗勇,因而需要经常性地进行体力训练和智力训练!


    某批警察叔叔正在进行智力训练:


    1 2 3 4 5 6 7 8 9 = 110;


    请看上边的算式,为了使等式成立,需要在数字间填入加号或者减号(可以不填,但不能填入其它符号)。之间没有填入符号的数字组合成一个数,例如:12+34+56+7-8+9 就是一种合格的填法;123+4+5+67-89 是另一个可能的答案。


    请你利用计算机的优势,帮助警察叔叔快速找到所有答案。


    每个答案占一行。形如:


12+34+56+7-8+9
123+4+5+67-89
......


    已知的两个答案可以输出,但不计分。
    
    各个答案的前后顺序不重要。


   注意:


    请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!
    
    请把所有类写在同一个文件中,调试好后,存入与【考生文件夹】下对应题号的“解答.txt”中即可。
    
    相关的工程文件不要拷入。
    
    请不要使用package语句。
    
    源程序中只能出现JDK1.5中允许的语法或调用。不能使用1.6或更高版本。



写的有点乱,先吃饭,回来了修改



#include <iostream>
#include <string>


using namespace std;


/**
 * 对8个空进行填空
 */
void dfs(int a[],int pos)
{
    if (pos == -1)
    {
        int result = 0;
        int temp = 1;
        int pre_mark = 1;
        // 1 2 3 4 5 6 7 8 9
        for (int i = 0;i < 8;i++)
        {
            if (a[i] == 3)
            {
                temp *= 10; temp += i + 2; continue;
            }
            else
            {
                switch(pre_mark)
                {
                case 1: result += temp; break;
                case 2: result -= temp; break;
                }
                if (a[i] == 1)
                {
                    pre_mark = 1;
                }
                else if (a[i] == 2)
                {
                    pre_mark = 2;
                }
                temp = i + 2;
            }
        }
        switch(pre_mark)
        {
        case 1: result += temp; break;
        case 2: result -= temp; break;
        }
        if (result == 110)
        {
            for (int i = 0;i < 8;i++)
            {
                cout << i + 1;
                switch(a[i])
                {
                case 1:
                    cout << '+';
                    break;
                case 2:
                    cout << '-';
                    break;
                }
            }
            cout << 9 << endl;
        }
        return;
    }
    for (int i = 1;i < 4;i++)
    {
        a[pos] = i;
        dfs(a,pos - 1);
    }
    return;
}
int main()
{
    int a[8] = {0};
    dfs(a,8 - 1);
    return 0;
}


评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值