23年蓝桥杯javaB组

23年蓝桥杯java-b组

前言:

23年蓝桥杯当时并没有参加,不过打算参加24年的蓝桥杯,于是打算复习下23年的题目,哦,不做不知道,做了几道题后评价一下,真的是老🐷上🏠,难死了;😂

发现蓝桥杯的题目都是偏思维,和立扣的题目还是有很大差别的;想要参加蓝桥杯的话,一定要将往年的真题都看一看;

话不多说,上题目!

A.阶乘求和

【问题描述】

令 S = 1! + 2! + 3! + … + 202320232023! ,
求 S 的末尾 9 位数字。
提示:答案首位不为 0 。

结果:420940313

看着题目很短,毕竟是签到题,但是没有一些常识的话还真不一定能做出来;

即:

应该知道的前置常识:

1.随着阶乘的增加,结果后边的0的个数会不断增加,0的数量还是很容易判断的,n的阶乘中可以挑出一对5和2,即能组成*10,就可以确认结果的最后一位会是0,通过思考,能想像到2很容易挑出,再挑出5就行了,以40为例,40的阶乘中有5,10,15,20,25,30,35,40,而25可以写成5 * 5,能拆分成两个5因子,所以40就应该是最小能满足最后9位为0的阶乘了;即使想不到40,45应该也是可以想到的;否则的话这道题是没法做的;

2.java中大数的计算可以使用BigInteger,使用long容易爆;

最后就变成了使用BigInteger进行for循环到40的阶乘累加和运算;

铛铛:

import java.math.BigInteger;
public class Main {
    public static void main(String[] args) {
        //先找出40的阶乘后有9个0,知道只用算到40就可以啦
       BigInteger sum=BigInteger.valueOf(0);
        for (int i = 1; i <=40 ; i++) {
            BigInteger sum1=BigInteger.valueOf(1);
            for (int j = 1; j <=i ; j++) {
                sum1=sum1.multiply(BigInteger.valueOf(j));
            }
            sum= sum.add(sum1);
        }
        // 取模获取最后九位数
        BigInteger modValue = BigInteger.valueOf(1000000000);
        BigInteger lastNineDigits = sum.mod(modValue);
        
        // 输出最后九位数
        System.out.println(lastNineDigits);
    }
}

B.幸运数字

【问题描述】

哈沙德数是指在某个固定的进位制当中,可以被各位数字之和整除的正整 数。例如 126 是十进制下的一个哈沙德数,因为 (126) 10 mod
(1+2+6) = 0 ; 126 也是八进制下的哈沙德数,因为 (126) 10 = (176) 8 , (126) 10 mod (1 + 7 + 6) = 0 ; 同时 126 也是 16 进制下的哈沙德数,因为 (126) 10 = (7 e ) 16 , (126) 10 mod (7 + e ) = 0 。小蓝认为,如果一个整数在二进制、八进制、十进制、十六进制下均为
哈沙德数,那么这个数字就是幸运数字,第 1 至第 10 个幸运数字的十进制表示 为:1 , 2 , 4 , 6 , 8 , 40 , 48 , 72 , 120 , 126 . . . 。现在他想知道第 2023 个幸运数 字是多少?你只需要告诉小蓝这个整数的十进制表示即可。

答案215040

第一眼看就知道是要考进制转换了,关键在于如何转换才能做到正确又不失优雅;如果没有个好的思路,会写的很乱甚至把自己绕进去了;

这里介绍一种方法:

既然转换8进制,那就除8,余数就是对应的进制的后位数字,商有余接着除,举题中例子126的8进制,126除8=15…6, 15除8=1…7,1除8=…1,三个余数分别是1,7,6是不是就是题目所述,其他同理;可写出方法:😏

public static int li(int n,int m) {//传入数字和要转换的进制
    int sum=0;
    while (n>0){
        sum=sum+n%m;
        n=n/m;
    }
        return sum;
}

逼格瞬间就低了,然后再从小遍历数字是否符合条件直到第2023个数字;

【代码实现】

public class Main {
    public static void main(String[] args) {
int count=0;
int i=0;
        while (count<2023)//统计数字个数
        {i=i+1;
            if(i%li(i,2)==0&&i%li(i,8)==0&&i%li(i,10)==0&&i%li(i,16)==0)//且连接,必须全部符合
            count++;

        }
        System.out.println(i);
    }
    public static int li(int n,int m) {//传入数字和要转换的进制
        int sum=0;
        while (n>0){
            sum=sum+n%m;
            n=n/m;
        }
            return sum;
    }
}

C.数组分割

[题目描述]

小蓝有一个长度为 N 的数组 A = [A0, A1,…, AN−1]。现在小蓝想要从 A 对应的数组下标所构成的集合 I = {0,
1, 2, . . . , N − 1} 中找出一个子集 R1,那么 R1在 I 中的补集为 R2。记 S1=∑r∈R1Ar,S2
=∑r∈R2Ar,我们要求 S1 和 S2 均为偶数,请问在这种情况下共有多少种不同的 R1。当 R1 或 R2 为空集时我们将 S1 或 S2 视为 0。 输入格式 第一行一个整数 T,表示有 T 组数据。 接下来输入 T 组数据,每组数据包含两行:第一行一个整数 N,表示数组
A 的长度;第二行输入 N 个整数从左至右依次为 A0, A1, . . . , AN−1,相邻元素之间用空格分隔。 输出格式
对于每组数据,输出一行,包含一个整数表示答案,答案可能会很大,你需要将答案对1000000007 进行取模后输出。

样例输入:

2
6 6
2
1 6

样例输出:

4
0

[提示]

对于第一组数据,答案为 4。(注意:大括号内的数字表示元素在数组中的下标。)
R1 = {0}, R2 = {1};此时 S1 = A0 = 6 为偶数, S2 = A1 = 6 为偶数。
R1 = {1}, R2 = {0};此时 S1 = A1 = 6 为偶数, S2 = A0 = 6 为偶数。
R1 = {0, 1}, R2 = {};此时 S1 = A0 + A1 = 12 为偶数, S2 = 0 为偶数。
R1 = {}, R2 = {0, 1};此时 S1 = 0 为偶数, S2 = A0 + A1 = 12 为偶数。
对于第二组数据,无论怎么选择,都不满足条件,所以答案为 0。

对于 20% 的评测用例,1 ≤ N ≤ 10。
对于 40% 的评测用例,1 ≤ N ≤ 10^2。
对于 100% 的评测用例,1 ≤ T ≤ 10, 1 ≤ N ≤ 10^3 , 0 ≤ Ai ≤ 10^9。

【题解思路】:

开始上难度了,🤒,如果平常经常只写立扣那种单接口题目,写这种的会很不适,所以才要提前接触;

先不说多个数组,对一个数组进行分析,题目意思是对于一个数组,希望能分成两个集合,A1,A2两集合的和都应该为偶数;然后计算A1,A2集合有多少种不同的组合;

我们能知道很多有用信息:

1.既然两集合都应为偶数,那么数组总和也应该是偶数;

2.题目中求的是R1即A1集合的总数,其实也是A2集合的总数,因为U-R1=R2,只用讨论左侧全部情况,右侧相当于也讨论了

由信息1知道,三个数组和肯定都是偶数,我们可以讨论A1集合的全部情况,那么A2集合不用讨论就已经注定了

题目中有两个注意点:

1.怎么将偶数的情况分析完:先分析数字是奇数还是偶数,统计偶数个数为l,总方法2的l次方

2.奇数的情况:先分析所有奇数个数为r,

​ 1)若r为奇数,则该数组不能分为两个偶数和,直接结束;

​ 2)若r为偶数,每次拿出偶数个奇数,即C(0, J) + C(2, J) + C(4, J) + … + C(J, J),又对于一个偶数个数的集合,从中拿去奇数个数和从中拿去偶数个数的方法应该相同,总方法=2的r次方=拿奇数个数的方法+拿偶数个数的方法;

具体解释看代码

【示例代码】

import java.util.Scanner;
public class Main{
        public static void main(String[] args) {
        //思路:题目意思是选出所有以偶数分割的数组方案;
            //可以知道数组和必须是偶数;
            int mod =1000000007;
            Scanner scanner = new Scanner(System.in);
            int a=scanner.nextInt();       //先传入有多少个数组;
           int[] b;//接收传入的数组
           while (a>0){
               int m=scanner.nextInt();  //数组长度
               b=new int[m];
               for (int i = 0; i <m; i++) {
                b[i]=scanner.nextInt();  //for循环接收数组各个值;
               }
                int l=0; //统计偶数个数
                int r=0;  // 统计奇数个数
               for (int i = 0; i <m; i++) {
                   if (b[i]%2==0)l++;
                   else r++;
               }
               if (r%2!=0) System.out.println(0);//如果奇数个数是奇数个,那么数组值和必为奇数,必然不可能满足条件;
               else {
                   if (r==0)r=1;          //特殊情况,特殊处理,方便之后计算;
                   int res=1;
                   for (int i = 0; i <l+r-1 ; i++) {//为什么答案会是这个?,
                       // 因为偶数中取法:2的l次方:每个数都是可取可不取;共有l个数;
                       // 奇数中取法2的r-1次方:每次必须取偶数个数;可以看作C(0, J) + C(2, J) + C(4, J) + … + C(J, J)
                       // 因为一共有偶数个数,那么数中的奇数个数和偶数个数和是相同的,所以取偶数个数的方法=取奇数个数的方法,又相加起来=全部方法=2的j次方;巴拉巴啦‘
                       res=res*2%mod;
                   }
                   System.out.println(res);

               }
               a--;
           }
        }
    }

其实上述A1,A2表述不是非常清晰,有些同学深究时还是不太懂单对奇数偶数分析为什么就包含了全部的情况,其实我们可以这样想:

因为题目让分为两个数组来做,对于上述所有的分析的都可以认为是对A1数组进行的分析,A1包含了所有偶数的情况*奇数的情况(A1中分成了两个小集合,一个集合只讨论偶数,一个集合只讨论奇数,总数=奇数方法 * 偶数方法),那么A2肯定和A1对应就行了;

D.矩形总面积

[题目描述]

平面上有个两个矩形 R1 和 R2,它们各边都与坐标轴平行。设 (x1, y1) 和(x2, y2) 依次是 R1
的左下角和右上角坐标,(x3, y3) 和 (x4, y4) 依次是 R2 的左下角和右上角坐标,请你计算 R1 和 R2 的总面积是多少?
注意:如果 R1 和 R2 有重叠区域,重叠区域的面积只计算一次。 输入格式 输入只有一行,包含 8
个整数,依次是:x1,y1,x2,y2,x3,y3,x4 和 y4

输出格式:

一个整数,代表答案。

样例输入:

2 1 7 4 5 3 8 6

样例输出:

22

[提示]

样例中的两个矩形如图所示:

image-20240330193038721

对于 20% 的数据,R1 和 R2 没有重叠区域。
对于 20% 的数据,其中一个矩形完全在另一个矩形内部。
对于 50% 的数据,所有坐标的取值范围是 [0, 10^3 ]。
对于 100% 的数据,所有坐标的取值范围是 [0, 10^5 ]。

【解题思路】:

又是一道思维逻辑题😥

首先要知道重叠面积应该是怎么形成的,才能下手敲代码,不然逻辑会非常混乱;

重叠面积应该是有两个矩形的最左下角点比较出个共同拥有的即较大的,最右上角点比较出较小的即共同拥有的,你可以仔细想想,是不是这样,当然,这种情况必须是有重叠,无重叠会出现负数;🤐:这点需要好好理解一下

代码语言就是:

int overlapX1 = Math.max(x1, x3);
int overlapY1 = Math.max(y1, y3);
int overlapX2 = Math.min(x2, x4);
int overlapY2 = Math.min(y2, y4);

【完整代码】

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int x1=scanner.nextInt();
        int y1=scanner.nextInt();
        int x2=scanner.nextInt();
        int y2=scanner.nextInt();
        int x3=scanner.nextInt();
        int y3=scanner.nextInt();
        int x4=scanner.nextInt();
        int y4=scanner.nextInt();

          //先算两个矩形的面积;
      long s1= (long) (x2 - x1) *(y2-y1);
      long s2= (long) (x4 - x3) *(y4-y3);
      //算重叠区域左下角和右上角坐标
        //若重叠,则左下角坐标为两者左下角坐标中的坐标最大者
        // 右上角坐标为两者右上角坐标中的最小者(仔细想一想)
        int overlapX1 = Math.max(x1, x3);
        int overlapY1 = Math.max(y1, y3);
        int overlapX2 = Math.min(x2, x4);
        int overlapY2 = Math.min(y2, y4);
        
      // 重叠面积,右减左,上减下,再和0比较,若大于,说明是存在重叠面积的;
     long s= (long) Math.max(0, (overlapX2 - overlapX1)) *Math.max(0,(overlapY2-overlapY1));
        
     s=s1+s2-s;
        System.out.println(s);

    }
}

E.蜗牛

【题目描述】

这天,一只蜗牛来到了二维坐标系的原点。

在 x 轴上长有 n 根竹竿。它们平行于 y 轴,底部纵坐标为 0,横坐标分别为 x1, x2, …, xn。竹竿的高度均为无限高,宽度可忽略。蜗牛想要从原点走到第 n 个竹竿的底部也就是坐标 (xn, 0)。它只能在 x 轴上或者竹竿上爬行,在 x 轴上爬行速度为 1 单位每秒;由于受到引力影响,蜗牛在竹竿上向上和向下爬行的速度分别为 0.7 单位每秒和 1.3 单位每秒。

为了快速到达目的地,它施展了魔法,在第 i 和 i + 1 根竹竿之间建立了传送门(0 < i < n),如果蜗牛位于第 i 根竹竿的高度为 ai 的位置 (xi , ai),就可以瞬间到达第 i + 1 根竹竿的高度为 bi+1 的位置 (xi+1, bi+1),请计算蜗牛最少需要多少秒才能到达目的地。

【输入格式】

输入共 1 + n 行,第一行为一个正整数 n;

第二行为 n 个正整数 x1, x2, . . . , xn;

后面 n − 1 行,每行两个正整数 ai , bi+1。

【输出格式】

输出共一行,一个浮点数表示答案(四舍五入保留两位小数)。

【样例输入】

3
1 10 11
1 1
2 1

【样例输出】

4.20

【提示】

蜗牛路线:

(0, 0) → (1, 0) → (1, 1) → (10, 1) → (10, 0) → (11, 0),花费时间为 1+1/0.7+0+1/1.3+1 ≈ 4.20

对于 20% 的数据,保证 n ≤ 15;

对于 100% 的数据,保证 n ≤ 105,ai , bi ≤ 104,xi ≤ 109。

【思路】

首先需要知道这是一道动态规划类型的题目,因为题目中有最短时间的字眼,并且前一个和后一个之间有联系,很容易就能想到;

而且也能很容易写出前面的dp值,复杂的是递推公式如何确立,因为该题并不是单独的一个点,而是包含了传送门,需要同时维护两个递推公式;想到这里,应该就有些思路了;再详细的就不说了,毕竟动态规划看的就是条件,做起来套公式还是没有那么多的弯弯绕绕的;🤗

【具体代码】

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();  // 竹竿的数量

        // 输入每个竹竿的x坐标
        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = scanner.nextInt();
        }

        // 输入每个传送门的位置和传送到的位置
        double[][] b = new double[n][2];
        for (int i = 0; i < n-1; i++) {
            b[i][0] = scanner.nextInt();  // 传送门自身的传送点在哪个高度
            b[i][1] = scanner.nextInt();  // 传送门传送到的下一个杆子的高度
        }

        // 动态规划计算最短时间
        double[][] dp = new double[n][2];
        dp[0][0] = a[0];  // 第一根竹竿底部的位置
        dp[0][1] = a[0] + b[0][0] / 0.7;  // 第一个竹竿的传送门

        for (int i = 1; i < n; i++) {
            if(b[i][0]<=b[i-1][1])// 传送到的点在自己杆子传送门的上边,需要下滑
            dp[i][1]=Math.min(dp[i-1][0]+(a[i]-a[i-1])+b[i][0]/0.7,dp[i-1][1]+(b[i-1][1]-b[i][0])/1.3);          //该根杆子的传送点
               else dp[i][1]= Math.min(dp[i-1][0]+(a[i]-a[i-1])+b[i][0]/0.7,dp[i-1][1]+(b[i][0]-b[i-1][1])/0.7); //传到的点在自己传送门的下方,需要上移
            dp[i][0]=Math.min(dp[i-1][0]+(a[i]-a[i-1]),dp[i-1][1]+b[i-1][1]/1.3);          // 该根杆子的底部节点;
        }

        // 输出结果,保留两位小数
        System.out.printf("%.2f\n", dp[n - 1][0]);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/502702.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

13 完全分布式搭建-集群配置

1.集群部署规划 NameNode 和 SecondaryNameNode 不要安装在同一台服务器 ResourceManager 也很消耗内存&#xff0c;不要和 NameNode、SecondaryNameNode 配置在 同一台机器上。 在文章中与教材上有区别&#xff0c;在理论课上已讲解。 masterslave01slave02HDFS NameNode D…

HashMap关键源码带读

文章目录 目录 文章目录 前言 1 . 成员变量 灵魂五问 第一问: 默认初始化容量为啥是16? 第二问: 最大容量为什么必须是2的幂? 第三问: 链表转红黑树的阈值为什么是8? 第四问: 红黑树转链表的阈值为什么是6? 第五问: 默认加载因子为什么是0.75? 2. 成员方法 eq…

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记15:PWM输出

系列文章目录 嵌入式|蓝桥杯STM32G431&#xff08;HAL库开发&#xff09;——CT117E学习笔记01&#xff1a;赛事介绍与硬件平台 嵌入式|蓝桥杯STM32G431&#xff08;HAL库开发&#xff09;——CT117E学习笔记02&#xff1a;开发环境安装 嵌入式|蓝桥杯STM32G431&#xff08;…

Linux:TCP协议的三次握手和四次挥手

文章目录 三次握手四次挥手为什么要进行三次握手&#xff1f;三次握手也不安全 本篇解析的主要是TCP的三次握手和四次挥手的过程 三次握手 如图所示&#xff0c;在TCP要进行链接的时候&#xff0c;其实是要进行三次握手的 第一次握手是指&#xff0c;此时客户端要给服务器发送…

AI学习-Pandas数据处理分析

文章目录 1. Pandas概述2. Series用法2.1 Series的创建2.2 Series的取值2.3 Series的相关方法 3. DataFrame用法3.1 DataFrame创建3.2 DataFrame取值3.3 DataFrame相关方法 1. Pandas概述 ​ Pandas 是一个开源的数据分析处理库&#xff0c;它应用在数据科学、统计分析、机器学…

python中的deque详解

文章目录 摘要示例1&#xff1a;基本使用示例2&#xff1a;使用maxlen限制队列长度示例3&#xff1a;使用deque实现滑动窗口算法示例 4: 使用 deque 实现旋转数组示例 5: 使用 deque 实现最大/最小栈示例 6: 使用 deque 实现广度优先搜索&#xff08;BFS&#xff09; 摘要 deq…

力扣56. 合并区间

Problem: 56. 合并区间 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.将数组按内部的一维数组的第一项按从小到大的顺序排序&#xff1b; 2.创建二维结果数组merged&#xff0c;并将排序后的数组中的第一个一维度数组存入到merged中&#xff1b; 3.从后面的一…

理解游戏服务器架构-部署架构

目录 前言 我所理解的服务器架构 什么是否部署架构 部署架构的职责 进程业务职责 网络链接及通讯方式 与客户端的连接方式 服务器之间连接关系 数据落地以及一致性 数据库的选择 数据访问三级缓存 数据分片 读写分离 分布式数据处理 负载均衡 热更新 配置更新 …

express实现用户登录和注册接口

目录 1 创建数据库2 连接数据库3 集成ORM库4 创建业务逻辑5 创建路由7 测试接口总结 我们在编写后端接口的时候操作数据库是一种常见的功能需求&#xff0c;express本身并不提供直接操作数据库的能力&#xff0c;需要借助第三方库来操作数据库&#xff0c;本篇讲解一下软件开发…

【Java】LinkedList模拟实现

目录 整体框架IMyLinkedList接口IndexNotLegalException异常类MyLinkedList类成员变量(节点信息)addFirst(头插)addLast(尾插)在指定位置插入数据判断是否存在移除第一个相等的节点移除所有相等的节点链表的长度打印链表释放回收链表 整体框架 IMyLinkedList接口 这个接口用来…

2006-2023年2月各地级市城投债详细数据

2006-2023.2各地级市城投债详细数据 1、时间&#xff1a;2006-2023.2 2、来源&#xff1a;深圳证券交易所和上海证券交易所官网、人民银行、证券监督管理委员会等金融监管机构等官网 3、指标&#xff1a;省份、城市、证券代码、证券简称、债券简称、证券全称、债券初始面值单…

C语言使用STM32开发板手搓高端家居洗衣机

目录 概要 成品效果 背景概述 1.开发环境 2.主要传感器。 技术细节 1. 用户如何知道选择了何种功能 2.启动后如何进行洗衣 3.如何将洗衣机状态上传至服务器并通过APP查看 4.洗衣过程、可燃气检测、OLED屏显示、服务器通信如何并发进行 小结 概要 本文章主要是讲解如…

使用pdf表单域填充pdf内容

需要引用如下包 <dependency><groupId>com.itextpdf</groupId><artifactId>itext-core</artifactId><version>8.0.3</version><type>pom</type></dependency>1、预先准备一个pdf模板&#xff0c;并在指定位置添加…

创建一个vue3 + ts + vite 项目

vite 官网&#xff1a; https://cn.vitejs.dev/guide/ 兼容性注意 Vite 需要 Node.js 版本 18&#xff0c;20。然而&#xff0c;有些模板需要依赖更高的 Node 版本才能正常运行&#xff0c;当你的包管理器发出警告时&#xff0c;请注意升级你的 Node 版本。 安装项目 1. 使用n…

政安晨:【Keras机器学习实践要点】(五)—— 通过子类化创建新层和模型

目录 介绍 安装 层级&#xff1a;状态&#xff08;权重&#xff09;与某些计算的组合 层可以有不可训练的重量 最佳实践&#xff1a;推迟权重的创建&#xff0c;直到输入的形状已知。 层可以递归组合 后端不可知层和特定后端层 add_loss()方法 可以选择在您的层上启用…

【DETR系列目标检测算法代码精讲】01 DETR算法01 DETR算法框架和网络结构介绍

为什么要有DETR 总所周知&#xff0c;传统的目标检测算法非常依赖于anchor和nms等手工设计操作&#xff0c;非常费时费力&#xff0c;自然而然的就产生了取消这些操作的想法。但是我们首先需要思考的是&#xff0c;为什么我们需要anchor和nms&#xff1f; 因为我们是没有指定…

3D汽车模型线上三维互动展示提供视觉盛宴

VR全景虚拟看车软件正在引领汽车展览行业迈向一个全新的时代&#xff0c;它不仅颠覆了传统展览的局限&#xff0c;还为参展者提供了前所未有的高效、便捷和互动体验。借助于尖端的vr虚拟现实技术、逼真的web3d开发、先进的云计算能力以及强大的大数据处理&#xff0c;这一在线展…

Docker Swarm安装部署应用

一、Docker Swarm核心概念 1、什么是Docker Swarm GitHub地址 Docker Swarm 是 Docker 官方推出的容器集群管理工具&#xff0c;基于 Go 语言实现。使用它可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机&#xff0c;快速打造一套容器云平台。 Docker Swarm 是生产…

Java线程池工作原理浅析

为什么要用线程池&#xff1f; 1、线程属于稀缺资源&#xff0c;它的创建会消耗大量系统资源 2、线程频繁地销毁&#xff0c;会频繁地触发GC机制&#xff0c;使系统性能降低 3、多线程并发执行缺乏统一的管理与监控 线程池的使用 线程池的创建使用可通过Executors类来完成…

【网站项目】泉文化管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…