第六届蓝桥杯省赛(Java B)

1、三角形面积
如图所示。图中的所有小方格面积都是1。
那么,图中的三角形面积应该是多少呢?
请填写三角形的面积。不要填写任何多余内容或说明性文字。
在这里插入图片描述

思路:这应该是初中数学题吧,两种方法,整体和局部。
①:整体法:在三角形周围取正方形,分别减去多余的即是三角形的面积。
②:局部法:将此三角形分为上下两部分,计算面积取和即可。
ans=28

2、立方变自身
观察下面的现象,某个数字的立方,按位累加仍然等于自身。
1^3 = 1
8^3 = 512 5+1+2=8
17^3 = 4913 4+9+1+3=17

请你计算包括1,8,17在内,符合这个性质的正整数一共有多少个?
请填写该数字,不要填写任何多余的内容或说明性的文字。

思路:从1枚举到一个较大的数字,依次判断此次枚举的数是否符合题意。

public class B {

	public static void main(String[] args) {
		int sum = 0;
		for (int i = 1; i < 10000; ++i) {
			long cnt = i * i * i;
			char[] s = String.valueOf(cnt).toCharArray();// 将数字转化成数组
			long ans = 0;
			for (int j = 0; j < s.length; ++j) {
				int t = s[j] - '0';// 减字符0是把字符变成数字,进行加减,比如把char的3变成int的3,再进行加减
				ans += t;
			}
			if (ans == i) {
				sum++;
			}
		}
		System.out.println(sum);
	}
}

3、三羊献瑞
观察下面的加法算式
在这里插入图片描述
其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。
请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。

思路:由于加法的进位只能是1,所以汉字三代表的数字就是1,也很容易知道汉字祥代表的也就是9,然后分别定义 a祥 b瑞 c生 d辉 e羊 f献 g气,然后开始暴力枚举。

public class C {
	public static void main(String[] args) {
		for (int a = 9; a <= 9; ++a) {
			for (int b = 0; b <= 9; ++b) {
				for (int c = 0; c <= 9; ++c) {
					for (int d = 0; d <= 9; ++d) {
						for (int e = 0; e <= 9; ++e) {
							for (int f = 0; f <= 9; ++f) {
								for (int g = 0; g <= 9; ++g) {
									if (a != b && a != c && a != d && a != e && a != f && a != g && b != 1 && b != c
											&& b != d && b != e && b != f && b != g && c != 1 && c != d && c != e
											&& c != f && c != g && d != 1 && d != e && d != f && d != g && e != 1
											&& e != f && e != g && f != 1 && f != g && g != 1) {
										int ans = a * 1000 + b * 100 + c * 10 + d;
										int ans1 = 1000 + e * 100 + f * 10 + b;
										int sum = 10000 + e * 1000 + c * 100 + b * 10 + g;
										if ((ans + ans1) == sum) {
											System.out.println(1 + " " + e + " " + f + " " + b);
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
}

4、循环节长度
两个整数做除法,有时会产生循环小数,其循环部分称为:循环节。
比如,11/13=6=>0.846153846153…… 其循环节为[846153] 共有6位。
下面的方法,可以求出循环节的长度。
请仔细阅读代码,并填写划线部分缺少的代码。

思路:f函数的大概意思就是每次将n取膜,依次放入Vector中,当此时取膜之后的n还没放入Vector但是我的v.indexOf(n)>=0就表示Vector已经有相同的元素了(如果没有找到元素,这个是会返回-1的),也就是会开始产生循环了,所以此时直接返回Vector的size就行了。
//这题更新一下,由于每次循环节的开始不是从第一个数开始就是循环节,而之前填的v.size()是默认循环节从一开始就是,所以正确答案应该是第二次出现这个数的时候vector的长度减去最一开始的这个数出现的下标,即v.size()-v.indexOf(n)

import java.util.Vector;

public class D {
	public static int f(int n, int m) {
		n = n % m;
		Vector v = new Vector();
		for (;;) {
			v.add(n);
			n *= 10;
			n = n % m;
			if (n == 0)
				return 0;
			if (v.indexOf(n) >= 0)
				return v.size()-v.indexOf(n); // 填空
		}
	}

	public static void main(String[] args) {
		System.out.println(f(11, 13));
	}
}

5、九数组分数
1,2,3…9 这九个数字组成一个分数,其值恰好为1/3,如何组法?
下面的程序实现了该功能,请填写划线部分缺失的代码。

思路:这题是一个全排列的板子,我们需要填的空其实就是一个回溯的过程,所以需要将值又变为一开始的样子。

public class E {
	public static void test(int[] x) {
		int a = x[0] * 1000 + x[1] * 100 + x[2] * 10 + x[3];
		int b = x[4] * 10000 + x[5] * 1000 + x[6] * 100 + x[7] * 10 + x[8];
		if (a * 3 == b)
			System.out.println(a + " " + b);
	}

	public static void f(int[] x, int k) {
		if (k >= x.length) {
			test(x);
			return;
		}

		for (int i = k; i < x.length; i++) {
			{
				int t = x[k];
				x[k] = x[i];
				x[i] = t;
			}
			f(x, k + 1);
			{
				int t = x[k];
				x[k] = x[i];
				x[i] = t;
			} // 填空
		}
	}

	public static void main(String[] args) {
		int[] x = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
		f(x, 0);
	}
}

6、加法变乘法
我们都知道:1+2+3+ … + 49 = 1225
现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015
比如:
1+2+3+…+1011+12+…+2728+29+…+49 = 2015
就是符合要求的答案。
请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。
注意:需要你提交的是一个整数,不要填写任何多余的内容。

思路:逆向考虑,两重for循环枚举48个加号,注意不能相邻。

public class F {
//逆向考虑
	public static void main(String[] args) {
		int sum = 0;
		for (int i = 1; i < 49; ++i) {
			for (int j = i + 2; j < 49; ++j) {
				sum = 1225;
				sum -= i + i + 1 + j + j + 1;//减去当前这四个数的和
				sum += i * (i + 1) + j * (j + 1);//用乘法来代替
				if (sum == 2015) {
					System.out.println("i= " + i + " j= " + j);
				}
			}
		}
	}
}
output:
i= 10 j= 27
i= 16 j= 24
ans=16;

7、牌型种数
小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
请填写该整数,不要填写任何多余的内容或说明文字。

思路:可以用暴力或者dfs或者背包来做

//暴力做法
public class G {
	public static void main(String[] args) {
		long sum = 0;
		//每个变量从0循环到4的意思就是这种类型的牌可以一张都不选,或者4张全选
		for (int a = 0; a <= 4; ++a) {
			for (int b = 0; b <= 4; ++b) {
				for (int c = 0; c <= 4; ++c) {
					for (int d = 0; d <= 4; ++d) {
						for (int e = 0; e <= 4; ++e) {
							for (int f = 0; f <= 4; ++f) {
								for (int g = 0; g <= 4; ++g) {
									for (int h = 0; h <= 4; ++h) {
										for (int i = 0; i <= 4; ++i) {
											for (int j = 0; j <= 4; ++j) {
												for (int k = 0; k <= 4; ++k) {
													for (int l = 0; l <= 4; ++l) {
														for (int m = 0; m <= 4; ++m) {
															if (a + b + c + d + e + f + g + h + i + j + k + l
																	+ m == 13) {
																sum++;
															}
														}
													}
												}
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
		System.out.println(sum);
	}
}


//dfs做法
public class G {
	// 每种牌可以选0~4种,选择牌的总数相加等于13
	static int ans = 0;
	public static void dfs(int cnt, int sum) {//cnt表示当前选的牌型种类,sum表示选了多少牌
	//dfs的深度是牌的类型,每种牌可以选0~4种,选的牌的总数相加==13
		if (sum > 13) {
			return;
		}
		if (cnt == 13) {
			if (sum == 13) {
				ans++;
			}
			return;
		}
		for (int i = 0; i < 5; ++i) {
			dfs(cnt + 1, sum + i);
		}
	}
	public static void main(String[] args) {
		dfs(0, 0);
		System.out.println(ans);
	}
}
//dp做法
public class G {
	public static void main(String[] args) {
		int[][] dp = new int[14][14];// 当前选到第i种牌,总共有j张牌时的解的个数
		dp[0][0] = 1;
		for (int i = 1; i <= 13; ++i) {// 一共13种牌的种类
			for (int j = 0; j <= 13; ++j) {// 此时有多少张牌
				for (int k = 0; k <= 4; ++k) {// 每张牌从0循环到4的意思就是这种类型的牌可以一张都不选,或者4张全选
					if (j + k <= 13) {
						dp[i][j + k] += dp[i - 1][j];
					}
				}
			}
		}
		System.out.println(dp[13][13]);
	}
}

8、饮料换购
乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去,但不允许赊账。
请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的n瓶饮料,最后他一共能得到多少瓶饮料。
输入:一个整数n,表示开始购买的饮料数量
输出:一个整数,表示实际得到的饮料数
用户输入:
100
程序应该输出:
149
用户输入:
101
程序应该输出:
151

import java.util.Scanner;

public class H {
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		long n = cin.nextLong();
		long sum = 0;
		long cnt = 0;
		long n1 = n;// 用n1记录下最一开始有的饮料
		while (n >= 3) {// 当饮料不足三瓶的时候就不可以兑换了
			cnt = n / 3;// 统计当前有的饮料盖可以换多少饮料
			sum += cnt;// 将得到的饮料进行累加
			n = cnt + n % 3;// 将上次得到的饮料再加上之前因为不够三瓶而不能兑换的饮料
			// 即 目前有的瓶盖=换来的饮料+剩余的瓶盖
		}
		System.out.println(sum + n1);
	}
}

后两题待更新…

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值