目录

题目链接:1.报数游戏 - 蓝桥云课

题目描述

答案提交

运行限制

思路

找规律的代码

前50个数字为

前100个数字为

发现规律

验证规律

解法一:数学咱学学

AC情况

时间复杂度和空间复杂度

总结


题目链接:1.报数游戏 - 蓝桥云课

注:下述题目描述和示例均来自蓝桥云客

题目描述

        小蓝和朋友们在玩一个报数游戏。由于今年是 2024 年,他们决定要从小到大轮流报出是 20 或 24 倍数的正整数。前 10 个被报出的数是:20,24,40,48,60,72,80,96,100,120。请问第 202420242024 个被报出的数是多少?

答案提交

        这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

运行限制

语言最大运行时间最大运行内存
C++1s256M
C1s256M
Java3s512M
Python310s512M
PyPy33s512M
Go5s512M
JavaScript5s512M

思路

        我们上来的第一步应该干嘛。对于蓝桥杯的填空题来说。大多数都是考研你的数学知识,我们研究一下这段数字有什么规律。

        我们比如看一下前50个数都是什么,然后找找规律。

找规律的代码

package src;

import java.util.Arrays;

public class TK {
	public static void main(String[] args) {
		/**
		 *  小蓝和朋友们在玩一个报数游戏。
		 *       由于今年是 2024 年,他们决定要从小到大轮流报出是 20 或 24 倍数的正整数。
		 *       前 10 个被报出的数是:20,24,40,48,60,72,80,96,100,120。
		 *       请问第 202420242024 个被报出的数是多少?
		 */
		long[] arr = new long[50];
		int i = 20;
		int pos = 0;
		int time = 0;
		while(time < 50) {
			if((i % 20) == 0 || (i % 24) == 0) {
				// 找到了
				arr[pos] = i;
				System.out.println(i);
				pos++;
				i++;
				time++;
				
			}
			i++;
		}
		System.out.println(Arrays.toString(arr));
	}
}

前50个数字为

20, 24, 40, 48, 60, 72, 80, 96, 100, 120,

140, 144, 160, 168, 180, 192, 200, 216,

220, 240, 260, 264, 280, 288, 300, 312,

320, 336, 340, 360, 380, 384, 400, 408,

420, 432, 440, 456, 460, 480, 500, 504,

520, 528, 540, 552, 560, 576, 580, 600

前100个数字为

20, 24, 40, 48, 60, 72, 80, 96, 100, 120,

140, 144, 160, 168, 180, 192, 200, 216,

220, 240, 260, 264, 280, 288, 300, 312,

320, 336, 340, 360, 380, 384, 400, 408,

420, 432, 440, 456, 460, 480, 500, 504,

520, 528, 540, 552, 560, 576, 580, 600,

620, 624, 640, 648, 660, 672, 680, 696,

700, 720, 740, 744, 760, 768, 780, 792,

800, 816, 820, 840, 860, 864, 880, 888,

900, 912, 920, 936, 940, 960, 980, 984,

1000, 1008, 1020, 1032, 1040, 1056, 1060,

1080, 1100, 1104, 1120, 1128, 1140, 1152,

1160, 1176, 1180, 1200

发现规律

 在到了620之后,开始了和最开始之前一样的循环。如果把620以及之后的数字全部减去600,那么就是20,24,40,48,60,72,80,96,100,120,140,144,160,168,180,192.....

        那么为了验证我们的猜想再看看150个数字的情况

20, 24, 40, 48, 60, 72, 80, 96, 100, 120,

140, 144, 160, 168, 180, 192, 200, 216,

220, 240, 260, 264, 280, 288, 300, 312,

320, 336, 340, 360, 380, 384, 400, 408,

420, 432, 440, 456, 460, 480, 500, 504,

520, 528, 540, 552, 560, 576, 580, 600,

620, 624, 640, 648, 660, 672, 680, 696,

700, 720, 740, 744, 760, 768, 780, 792,

800, 816, 820, 840, 860, 864, 880, 888,

900, 912, 920, 936, 940, 960, 980, 984,

1000, 1008, 1020, 1032, 1040, 1056, 1060,

1080, 1100, 1104, 1120, 1128, 1140, 1152,

1160, 1176, 1180, 1200,

1220, 1224, 1240, 1248, 1260, 1272, 1280, 1296, 1300, 1320, 1340, 1344, 1360, 1368, 1380, 1392, 1400, 1416, 1420, 1440, 1460, 1464, 1480, 1488, 1500, 1512, 1520, 1536, 1540, 1560, 1580,

1584, 1600, 1608, 1620, 1632, 1640, 1656,

1660, 1680, 1700, 1704, 1720, 1728, 1740,

1752, 1760, 1776, 1780, 1800

验证规律

         那么现在的情况就是每600算是一个循环,懂了吧。


解法一:数学咱学学

        既然已经找到了规律,也就是每600的大小中会有50个数,也就是每50个数为一个循环。

i = 0:第01个数为20(600×i+20),第50个数为600(600×(i+1))

i = 1:第51个数为620(600×i+20),第100数为1200(600×(i+2))

i = 2:第101个数为1020(600×i+20),第150个数为1800(600×(i+3))

        那我们再回到题目,第202420242024个数是多少,我嘞个DJ 的,我们先看看

202420242024 / 50 和 202420242024 % 50是多少。

package src;

public class TK {
	public static void main(String[] args) {
		/**
		 *  小蓝和朋友们在玩一个报数游戏。
		 *       由于今年是 2024 年,他们决定要从小到大轮流报出是 20 或 24 倍数的正整数。
		 *       前 10 个被报出的数是:20,24,40,48,60,72,80,96,100,120。
		 *       请问第 202420242024 个被报出的数是多少?
		 */
		System.out.println("202420242024 ÷ 50=" + (202420242024L / 50));
		System.out.println("202420242024 % 50=" + (202420242024L % 50));
	}
}

202420242024 ÷ 50=4048404840
202420242024 % 50=24

        这意味着,202420242024是第4048404840组数(每组50个数),是这一组中的第24个数,那么位置就很明确了。

        一组的大小是600,那么组的起始位置就是600×4048404840,加上往后数24个,我们看看第24个是多少。是288.

20, 24, 40, 48, 60, 72, 80, 96, 100, 120,

140, 144, 160, 168, 180, 192, 200, 216,220, 240,

260, 264, 280, 288,←第24个

300, 312,320, 336, 340, 360, 380, 384, 400, 408,

420, 432, 440, 456, 460, 480, 500, 504,

520, 528, 540, 552, 560, 576, 580, 600

        所以最终的答案就是 600×4048404840 + 288 = ?

package src;

public class TK {
	public static void main(String[] args) {
		/**
		 *  小蓝和朋友们在玩一个报数游戏。
		 *       由于今年是 2024 年,他们决定要从小到大轮流报出是 20 或 24 倍数的正整数。
		 *       前 10 个被报出的数是:20,24,40,48,60,72,80,96,100,120。
		 *       请问第 202420242024 个被报出的数是多少?
		 */

	
		
		System.out.println("202420242024 % 50=" + (600L*4048404840L + 288L));
	}
}

600×4048404840 + 288 = 2429042904288

AC情况

时间复杂度和空间复杂度

        Oioioio请问有难度吗?



总结

题目解析:

        题目要求找出第202420242024个是20或24倍数的正整数。通过观察生成的数列,发现每50个数形成一个周期,每个周期内的数值递增600。例如,前50个数以600结尾,接下来的50个数从620开始,依此类推。

关键步骤:

  1. 确定周期和位置:
    第202420242024个数位于第4048404840个周期(每个周期50个数),是该周期的第24个数。

  2. 计算基准值:
    每个周期的起始值为 600 × 周期索引,例如第一个周期起始为600×0=0,第二个为600×1=600,依此类推。

  3. 查找周期内位置对应值:
    第一个周期的第24个数是288,因此第202420242024个数为:
    600 × 4048404840 + 288 = 2429042904288

答案:
2429042904288

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐