题目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;
}
}
}
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人