2015年蓝桥杯校内赛 javaB组
第一题
/java中提供了对正则表达式的支持。
有的时候,恰当地使用正则,可以让我们的工作事半功倍!
如下代码用来检验一个四则运算式中数据项的数目,请填写划线部分缺少的代码。
注意:只填写缺少代码,不要写任何多余内容,例如,已有的双引号。/
package B;
public class test5_1 {
public static int f(String s)
{
// return s.split("\\+|\\-|\\*|\\/").length;
// String类的函数返回的是一个字符串数组,只需要统计他的长度即可,即可求出四则运算中的数据项的数目。
return s.split("[^0-9]").length;//分离除了数字之外的字符,剩下字符的长度
}
public static void main(String[] args)
{
System.out.println(f("12+35*5-2*18/9-3")); //7
System.out.println(f("354*12+3-14/7*6")); //6
}
}
第二题
/1/1 + 1/2 + 1/3 + 1/4 + … 在数学上称为调和级数。
它是发散的,也就是说,只要加上足够多的项,就可以得到任意大的数字。
但是,它发散的很慢:
前1项和达到 1.0
前4项和才超过 2.0
前83项的和才超过 5.0
那么,请你计算一下,要加多少项,才能使得和达到或超过 15.0 呢?
请填写这个整数。
注意:只需要填写一个整数,不要填写任何多余的内容。比如说明文字。/
package B;
public class test5_2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
double sum =0.0;
for(int i = 1;i < 10000000;i++){
sum += 1.0 / i;
if(sum >= 15.0){
System.out.println(i);
break;
}
}
}
}
答案:1835421
第三题
/*
如果x的x次幂结果为10(参见【图1.png】),你能计算出x的近似值吗?
显然,这个值是介于2和3之间的一个数字。
请把x的值计算到小数后6位(四舍五入),并填写这个小数值。
注意:只填写一个小数,不要写任何多余的符号或说明。*/
package B;
public class test5_3 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//System.out.print(Math.pow());
for(double x = 2.5;;x+=0.00000001){
if((10-Math.pow(x, x))<0.0000001){
System.out.print(String.format("%.6f", x));
break;
}
}
}
}
答案:2.506184
第四题
今有7对数字:两个1,两个2,两个3,…两个7,把它们排成一行。
要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字。如下就是一个符合要求的排列:
17126425374635
当然,如果把它倒过来,也是符合要求的。
请你找出另一种符合要求的排列法,并且这个排列法是以74开头的。
注意:只填写这个14位的整数,不能填写任何多余的内容,比如说明注释等。
第五题
/勾股定理,西方称为毕达哥拉斯定理,它所对应的三角形现在称为:直角三角形。
已知直角三角形的斜边是某个整数,并且要求另外两条边也必须是整数。
求满足这个条件的不同直角三角形的个数。
【数据格式】
输入一个整数 n (0<n<10000000) 表示直角三角形斜边的长度。
要求输出一个整数,表示满足条件的直角三角形个数。
例如,输入:
5
程序应该输出:
1
再例如,输入:
100
程序应该输出:
2
再例如,输入:
3
程序应该输出:
0
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。/
package B;
import java.util.Scanner;
public class test5_5 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
int c = input.nextInt();
int count = 0;
for(int i = 1;i < c;i++){
for(int j = 1;j < c;j++){
if(c*c == i*i+j*j){
count++;
System.out.println(i+":"+j);
}
}
}
System.out.println(count/2);
}
}
第六题
package B;
import java.util.Scanner;
public class test5_6 {
static char[][] s = new char[9][9];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for (int i = 0; i < 9; i++) {
String str = sc.nextLine();
s[i] = str.toCharArray();//将字符串转换成字符数组
}
s(0,0);
}
public static void s(int i,int j){
if(i==9) {//匹配成功 输;
for (int m = 0;m < 9; m++) {
for (int k = 0; k < 9; k++) {
System.out.print(s[m][k]);
}
System.out.println();
}
return;
}
if(s[i][j]=='0'){//找到为0的进行赋值
for (int k = 0; k < 9; k++) {
boolean a = true;//标记行、列、同色九宫是否出现过 出现过为false 默认未出现过
for (int t = 0; t < 9; t++) {//判断行与列有没有出现:(char)(k+l+'0')
if(s[i][t]==(char) (k+1+'0')||s[t][j]==(char) (k+1+'0')) {//k+1+'0':这个1是1,2,3,4....中的1
//System.out.println(1+2+'0');
a = false;
break;
}
}
if(a)//行、列没有出现:(char)(k+l+'0'),进行同色九宫的判断
for (int m = (i/3)*3; m < (i/3)*3+3; m++) {//判断同色九宫是否出现:(char)(k+l+'0')
for (int n = (j/3)*3; n < (j/3)*3+3; n++) {
if(s[m][n]==(char) (k+1+'0')){
a = false;
break;
}
}
}
if(!a) continue;//判断k+1+'0'出现过,则跳过这个循环,继续进行k++的for循环,
//若没有出现过k+1+'0',则把这个值赋给s[i][j],继续递归
s[i][j] = (char) (k+1+'0');//赋值
if(j==8){//递归赋值
s(i+1,0);
}else{
s(i,j+1);//从第0行开始,从左到右,当j==8时,从下一行开始,从第0列开始,重复
}
s[i][j] = '0';//进行到后面的填空时,出现矛盾了,把前面上一个填过的空,回溯为零,再进行下一层r循环
}
}else{//不为’0’继续找
if(j==8){
s(i+1,0);
}else{
s(i,j+1);
}
}
}
}
第七题
/*G将军有一支训练有素的军队,这个军队除开G将军外,每名士兵都有一个直接上级(可能是其他士兵,也可能是G将军)。现在G将军将接受一个特别的任务,需要派遣一部分士兵(至少一个)组成一个敢死队,为了增加敢死队队员的独立性,要求如果一名士兵在敢死队中,他的直接上级不能在敢死队中。
请问,G将军有多少种派出敢死队的方法。注意,G将军也可以作为一个士兵进入敢死队。
输入格式
输入的第一行包含一个整数n,表示包括G将军在内的军队的人数。军队的士兵从1至n编号,G将军编号为1。
接下来n-1个数,分别表示编号为2, 3, …, n的士兵的直接上级编号,编号i的士兵的直接上级的编号小于i。
输出格式
输出一个整数,表示派出敢死队的方案数。由于数目可能很大,你只需要输出这个数除10007的余数即可。
样例输入1
3
1 1
样例输出1
4
样例说明
这四种方式分别是:
- 选1;
- 选2;
- 选3;
- 选2, 3。
样例输入2
7
1 1 2 2 3 3
样例输出2
40*/
package B;
import java.util.ArrayList;
import java.util.Scanner;
public class test5_7 {
public static int n;
public static int MOD = 10007;
public static ArrayList<Integer>[] list;//存储分支树,表示上下级
public static long[][] dp;//存储各个可能性
public void dfs(int root) {
dp[root][0] = 1;//root来
dp[root][1] = 1;//root不来
//System.out.println(list[root].size());
for(int i = 0;i < list[root].size();i++) {//root代指上级,i代指下级
int child = list[root].get(i);
System.out.println(child);
dfs(child);
dp[root][0] = dp[root][0] * (dp[child][0] + dp[child][1]) % MOD;//在root来的情况下:child来+child不来
dp[root][1] = dp[root][1] * dp[child][0] % MOD;//在root不来的情况下:child来。剔除了child不来的情况
}
}
//@SuppressWarnings("unchecked")
public static void main(String[] args) {
test5_7 test = new test5_7();
Scanner in = new Scanner(System.in);
n = in.nextInt();
list = new ArrayList[n + 1];
for(int i = 1;i <= n;i++)
list[i] = new ArrayList<Integer>();//申请列表1,2,3
for(int i = 2;i <= n;i++) {
int father = in.nextInt();//输入上级father
list[father].add(i);//依次将上级对应的下级添加入列表,用链表形式以父子关系存储上下级关系
}
dp = new long[n + 1][2];
test.dfs(1);
long result = (dp[1][0] + dp[1][1] - 1) % MOD;
System.out.println(result);
}
}