• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
百事可爱
一起努力鸭~~~
博客园    首页    新随笔    联系   管理    订阅  订阅
2016届蓝桥杯 Java C组 省赛试题及答案

题目1:

小明很喜欢猜谜语。
最近,他被邀请参加了X星球的猜谜活动。

每位选手开始的时候都被发给777个电子币。
规则是:猜对了,手里的电子币数目翻倍,
猜错了,扣除555个电子币, 扣完为止。

小明一共猜了15条谜语。
战果为:vxvxvxvxvxvxvvx
其中v表示猜对了,x表示猜错了。

请你计算一下,小明最后手里的电子币数目是多少。

请填写表示最后电子币数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
代码实现:

package 蓝桥2016;
 
public class T1 {

	public static void main(String[] args) {
		 String string = "vxvxvxvxvxvxvvx";
		 int sum = 777;
		 for(int i=0;i<15;i++) {
			 if(string.charAt(i)=='v') {
				 sum=sum*2;
			 }
			 else {
				 sum=sum-555;
			 }
		 }
		 System.out.println(sum);
	}
//58497
}

题目2:

有一堆煤球,堆成三角棱锥形。具体:
第一层放1个,
第二层3个(排列成三角形),
第三层6个(排列成三角形),
第四层10个(排列成三角形),
…
如果一共有100层,共有多少个煤球?

请填表示煤球总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
代码实现:

package 蓝桥2016;
/*找规律:
 * 1 = 0+1
 * 3 = 1+2
 * 6 = 3+3
 * 10 =6+4
 * 发现:每层的数量 = 上一层的数量+以1,2,3,4以此增加的数字*/
public class T2 {

	public static void main(String[] args) {
		 int rowNum = 0;//每层的数量
		 int sum = 0;//全部总数量
		 for(int i=1;i<=100;i++) {//以1,2,3,4以此增加的数字 定义为步长,步长又与i同
			 rowNum = rowNum + i;
			 sum+=rowNum;
		 }
		 System.out.println(sum);
	}
//171700
}

题目3:

如果把一个正整数的每一位都平方后再求和,得到一个新的正整数。
对新产生的正整数再做同样的处理。

如此一来,你会发现,不管开始取的是什么数字,
最终如果不是落入1,就是落入同一个循环圈。

请写出这个循环圈中最大的那个数字。

请填写该最大数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
代码实现:

package 蓝桥2016;

import java.util.Scanner;

/*fenxi :
 *  正整数的遍历的数字范围?? 也不知道它有多少位?? 将每一位取出?? 对新产生的正整数再做同样的处理??
 *  1. 先实现:把一个正整数的每一位取出都平方后再求和,得到一个新的正整数(前提:不知道位数)
 *  例如:1234  
 *  1234%10 = 4 就取出来4  再1234/10 = 123
 *  123 %10 =3  就取出来3   再123/10 = 12 
 *  依次将每一位取出来
 *  sum = 16+9+4+1 = 30
 *  2. 需要对新产生的正整数sum再做同样的处理。至于多少次也未知?
 *  需要将一次的过程放到循环中去;
 *  sum应该作为下一次循环的num */

public class T3 {

	public static void main(String[] args) {
		 Scanner scanner = new Scanner(System.in);
		 int num = scanner.nextInt();//输入一个正整数
		for(int i=0;i<100;i++) {
			int sum = 0;//每位数字的平方和
			 while(true) {//因为不知道它有多少位,就不知道需要取出位数多少次?
				 int ge = num%10;//取出个位数
				 sum = sum + ge*ge;//个位数的平方累加到和中
				 num = num/10;
				 //何时退出死循环?就是所有位数取完了?
				 if(num == 0) {//就证明num此时已经是左边第一位
					 num = sum;//sum应该作为下一次循环的num
					 break;
				 }
			 }
			 System.out.println(sum);
		}
/*只展示部分结果:
 * 1234
30
9
81
65
61
37
58
89
145
42
20
4
16
37
58
89
145
42
20
4
16
37
58
89
145
发现 37 58 到16 这八个数形成一个循环圈 最大的就是145即答案*/			 
	}
}

题目4:

我们来玩一个游戏。
同时掷出3个普通骰子(6个面上的数字分别是1~6)。
如果其中一个骰子上的数字等于另外两个的和,你就赢了。
下面的程序计算出你能获胜的精确概率(以既约分数表示)
仔细阅读代码,填写划线部分缺少的内容。

public class Main
{
	public static int gcd(int a, int b)
	{
		if(b==0) return a;
		return gcd(b,a%b);
	}
	
	public static void main(String[] args)
	{	
		int n = 0;
		for(int i=0; i<6; i++)
		for(int j=0; j<6; j++)
		for(int k=0; k<6; k++){
			if(________________________________) n++;   //填空位置
		}
		
		int m = gcd(n,6*6*6);
		System.out.println(n/m + "/" + 6*6*6/m);
	}
}

代码实现:

package 蓝桥2016;
/*fenxi:
 * 这题目坏的就是它的 for 循环的值设置的不好,它的取值只有0-5,但是骰子我们都知道是1-6所以我们判断大小时候每个值都要加上1*/
public class T4 {

	public static int gcd(int a, int b)
	{
		if(b==0) return a;
		return gcd(b,a%b);
	}
	
	public static void main(String[] args)
	{	
		int n = 0;
		for(int i=0; i<6; i++)
		for(int j=0; j<6; j++)
		for(int k=0; k<6; k++){
			if(i+1==j+k+2 || j+1==i+k+2 ||k+1==i+j+2) n++;   //填空位置
		}
		
		int m = gcd(n,6*6*6);
		System.out.println(n/m + "/" + 6*6*6/m);
		}
//  5/24
}

题目6:

     B      DEF
A + --- + ------- = 10
     C      GHI

这个算式中A到I 代表1到9的数字,不同的字母代表不同的数字。

比如:

6+8/3+952/714 就是一种解法,9

5+3/1+972/486 是另一种解法。10

这个算式一共有多少种解法?

注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。

方法1:循环嵌套 (仅需要注意分子)

package 蓝桥2016;

/*fenxi:
 * 给的式子说明:用1到9而且数字不重复使用 实现算式等于10
 **/
public class T6 {
	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;
							for (int f = 1; f <= 9; f++) {
								if (f == a || f == b || f == c || f == d || f == e)
									continue;
								for (int g = 1; g <= 9; g++) {
									if (g == a || g == b || g == c || g == d || g == e || g == f)
										continue;
									for (int h = 1; h <= 9; h++) {
										if (h == a || h == b || h == c || h == d || h == e || h == f || h == g)
											continue;
										for (int i = 1; i <= 9; i++) {
											if (i == a || i == b || i == c || i == d || i == e || i == f || i == g
													|| i == h)
												continue;
											if (a + b*1.0 / c +  (d * 100 + e * 10 + f)*1.0 / (g * 100 + h * 10 + i)  == 10) {
												count++;//注意此处,分子乘以1.0 保证相除时不丢弃小数
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
		System.out.println(count);
//29
	}
}

方法2:全排列(推荐此模板)

package 蓝桥2016;

/*fenxi:
 * 给的式子说明:用1到9而且数字不重复使用 实现算式等于10??
 * 
 * 看成1到9的全排列:得到所有排列情况,然后将每一种情况再进行带入算式检测
 * //实现从m个数字里面取m个数字进行全排列(此时,m个数字不重复)
 * 特别:分子要乘以1.0 否则两个整数相除只保留整数, 应该保留小数
 * */
public class T6 {
	static int count =0;
	
	public static void main(String[] args) {
		int[] arr = {1, 2, 3,4,5,6,7,8,9};
		sort(arr, 0, arr.length - 1);
		 System.out.println(count);
	}
//29	
	/**
	 * @param arr   保存要全排列的所有数字集合
	 * @param start 排序交换时定住的首位下标
	 * @param end   排序交换时末尾元素的下标
	 */
	public static void sort(int[] arr, int start, int end) {
		// 出口
		if (start == end) {// 全排列的某一种方案
			 if(arr[0]+arr[1]*1.0/arr[2]+(arr[3]*100+arr[4]*10+arr[5])*1.0/(arr[6]*100+arr[7]*10+arr[8])==10) {
				 count++;
			 }
			return;
		}

		for (int i = start; i <= end; i++) {
			swap(arr, start, i);
			sort(arr, start + 1, end);
			swap(arr, start, i);//还原
		}
	}

	// 交换数组元素
	public static void swap(int[] arr, int i, int j) {
		int c = arr[i];
		arr[i] = arr[j];
		arr[j] = c;
	}
}

题目7:

小明最近喜欢搭数字积木,
一共有10块积木,每个积木上有一个数字,0~9。
搭积木规则:
每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。
最后搭成4层的金字塔形,必须用完所有的积木。
下面是两种合格的搭法:
0
1 2
3 4 5
6 7 8 9

0
3 1
7 5 2
9 8 6 4

请你计算这样的搭法一共有多少种?
请填表示总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

代码实现:

package 蓝桥2016;
/*和上一个题相似的思路:先进行0到9 的全排列,然后将每一种情况再进行检测:
 * 
 * 将十个数字分成四层:假设是abcdefghik a在最上层(称为第一层),b c在第二层,def在第三层,ghik在第四层
 * 条件判断:(每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小)
 * a<b a<c 
 * b<d b<e  c<e c<f
 * d<g d<h  e<h e<i  f<i f<j
 * */
public class T7 {
	static int count =0;
	public static void main(String[] args) {
		int[] arr = {0,1, 2, 3,4,5,6,7,8,9};
		sort(arr, 0, arr.length - 1);
		 System.out.println(count);
	}
//768 	
	/**
	 * @param arr   保存要全排列的所有数字集合
	 * @param start 排序交换时定住的首位下标
	 * @param end   排序交换时末尾元素的下标
	 */
	public static void sort(int[] arr, int start, int end) {
		// 出口
		if (start == end) {// 全排列的某一种方案
			int a = arr[0];
			int b = arr[1];
			int c = arr[2];
			int d = arr[3];
			int e = arr[4];
			int f = arr[5];
			int g = arr[6];
			int h = arr[7];
			int i = arr[8];
			int j = arr[9];
			 if(a<b&&a<c&&b<d&&b<e&&c<e&&c<f&&d<g&&d<h&&e<h&&e<i&&f<i&&f<j) {
				 count++;
			 }
			return;
		}

		for (int i = start; i <= end; i++) {
			swap(arr, start, i);
			sort(arr, start + 1, end);
			swap(arr, start, i);//还原
		}
	}

	// 交换数组元素
	public static void swap(int[] arr, int i, int j) {
		int c = arr[i];
		arr[i] = arr[j];
		arr[j] = c;
	}
}

题目8:

任意给定一个正整数N
如果是偶数,执行: N / 2
如果是奇数,执行: N * 3 + 1

生成的新的数字再执行同样的动作,循环往复。

通过观察发现,这个数字会一会儿上升到很高,
一会儿又降落下来。
就这样起起落落的,但最终必会落到“1”
这有点像小冰雹粒子在冰雹云中翻滚增长的样子。

比如N=9
9,28,14,7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1
可以看到,N=9的时候,这个“小冰雹”最高冲到了52这个高度。

输入格式:
一个正整数N(N<1000000)
输出格式:
一个正整数,表示 不大于N的数字 ,经过冰雹数变换过程中,最高冲到了多少。

例如,输入:
10
程序应该输出:
52

再例如,输入:
100
程序应该输出:
9232

代码实现:

package 蓝桥2016;
import java.util.Scanner;

/*fenxi:
若直接写一个死循环,在其中去判断是奇数还是偶数,将每次的到的n与max比较,比max大,就更新max;然后死循环出口就是n==1 
输入10 输出16
按照以上思路: 10 5 16 8 4 2 1  那最大就是16  但是样例中却是52???
 *有坑!!!!!!
 *题目:输入一个正整数N, 输出:一个正整数,表示 “不大于N的数字”经过冰雹数变换过程中,最高冲到了多少
 *以n=10说明:我们需要一次求出1到10 这10个数字,每个数字所对应的最大值,然后在10个最大值中找到一个最终最大值
*/
public class T8 {

	public static void main(String[] args) {

		Scanner scanner = new Scanner(System.in);

		long n = scanner.nextLong();
		long maxLast = n;
		for (int i = 1; i <= n; i++) {
			long max = getMax(i);
			if (maxLast < max) {
				maxLast = max;
			}
		}
		System.out.println(maxLast);
	}

	// 获取每个数字循环后得到的最大值
	public static long getMax(long n) {
		long max = n;
		while (true) {

			if (max < n)
				max = n;

			if (n == 1) {// 退出死循环
				break;
			}
			if (n % 2 == 0) {
				n = n / 2;
			} else {
				n = n * 3 + 1;
			}
		}
		return max;
	}
}

题目9:

四平方和定理,又称为拉格朗日定理:
每个正整数都可以表示为至多4个正整数的平方和。
如果把0包括进去,就正好可以表示为4个数的平方和。

比如:
5 = 0^2 + 0^2 + 1^2 + 2^2
7 = 1^2 + 1^2 + 1^2 + 2^2
(^符号表示乘方的意思)

对于一个给定的正整数,可能存在多种平方和的表示法。
要求你对4个数排序:
0 <= a <= b <= c <= d
并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法

程序输入为一个正整数N (N<5000000)
要求输出4个非负整数,按从小到大排序,中间用空格分开

例如,输入:

5

则程序应该输出:

0 0 1 2

再例如,输入:

12

则程序应该输出:

0 2 2 2

代码实现:

package 蓝桥2016;

import java.util.Scanner;

/*疑问:怎么知道某个正整数是否可以表示为4个正整数的平方和???何时需要0???此数的遍历范围和该去遍历哪些数???输出第一个表示法???
 * fenxi:
 * 可以将四个正整数记为a b c d 
 * 1.  初始值从0开始循环,进行四次嵌套循环 需要满足:0 <= a <= b <= c <= d
 *     可以使内层循环的起始值大于等于外层循环的当前值
 * 2. 循环条件:a*a<=n;  a*a+b*b<=n; a*a+b*b+c*c<=n; a*a+b*b+c*c+d*d<=n;  */
public class T9 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		boolean isBreak = false;
		for (int a = 0; a * a <= n; a++) {
			if (isBreak == true)
				break;
			for (int b = a; a * a + b * b <= n; b++) {
				if (isBreak == true)
					break;
				for (int c = b; a * a + b * b + c * c <= n; c++) {
					if (isBreak == true)
						break;
					for (int d = c; a * a + b * b + c * c + d * d <= n; d++) {
						if (isBreak == true)
							break;
						if (a * a + b * b + c * c + d * d == n) {
							System.out.println(a + " " + b + " " + c + " " + d);
							// 若此处用break;只能退出最里层的for循环 所以需要用boolean的值标记一下状态 然后在每一层里面判断一下是否要退出此for循环
							isBreak = true;
						}
					}
				}
			}
		}
	}
}
posted on 2022-04-02 11:34  精致猪猪侠  阅读(134)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3