1. 质因数分解算法解析与实现
质因数分解是计算机科学和数学中的基础问题,在密码学、算法竞赛等领域有广泛应用。下面我将详细解析如何高效实现区间内整数的质因数分解。
1.1 质因数分解核心算法
质因数分解的基本思路是从最小的质数2开始,依次尝试将目标数分解为质数的乘积。我们来看核心代码的实现:
cpp复制void FenJie(int num){
int edge = num;
for(int i=2;i<=edge;i++){
if(num%i==0){
ans.push_back(i);
num/=i;
break;
}
}
if(num!=1)FenJie(num);
return ;
}
这个递归函数的工作原理是:
- 从2开始逐个尝试除数
- 当找到第一个能整除的因子时,将其加入结果列表
- 用商继续递归分解,直到商为1
注意:这里使用edge保存原始num值很重要,避免在循环中因num值改变而提前终止
1.2 性能优化技巧
原始算法虽然正确,但对于大数效率较低。我们可以进行以下优化:
- 除数上限优化:只需检查到√num即可,因为如果num有大于√num的因子,必定对应一个小于√num的因子
cpp复制int edge = sqrt(num); // 只需检查到平方根
- 跳过偶数检查:除2外,其他偶数不可能是质数
cpp复制if(i>2) i++; // 跳过偶数
- 预生成质数表:对于多次分解,可预先用筛法生成质数表
1.3 完整实现与输出格式
主函数处理输入输出并控制整体流程:
cpp复制int main(){
int start,end;
cin>>start>>end;
for(int i=start;i<=end;i++){
vector<int> zero;
ans = zero;
FenJie(i);
cout<<i<<'=';
for(int i=0;i<ans.size();i++){
cout<<ans[i];
if(i!=ans.size()-1)cout<<'*';
}
cout<<endl;
}
return 0;
}
输出格式示例:
code复制15=3*5
16=2*2*2*2
17=17
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 竞赛成绩统计系统设计
2.1 数据结构设计
处理学生成绩数据,我们需要合理的数据结构:
cpp复制struct StudentScore{
string name;
int score=0;
int ACs=0;
};
关键字段说明:
- name:学生姓名
- score:总耗时(含罚时)
- ACs:正确解答题数
2.2 输入数据处理
输入数据格式复杂,需要特殊处理:
cpp复制int GetScore(string scoreProblem,int penalty){
if(scoreProblem[0] == '-')return 0;
if(scoreProblem[0] == '0')return 0;
int score1=0,score2=0;
for(int i=0,change=0;i<scoreProblem.size();i++){
if(scoreProblem[i]=='('){
change++;continue;
}
if(scoreProblem[i]==')')break;
if(change)score2 = score2*10+scoreProblem[i]-'0';
else score1 = score1*10+scoreProblem[i]-'0';
}
return (score1+score2*penalty);
}
这段代码处理三种情况:
- "-"开头:未通过题目,不计分
- "0":未尝试题目,不计分
- "a(b)"形式:通过题目,计算总耗时=a+b×罚时
2.3 排序算法实现
成绩排序是核心功能,需要自定义比较函数:
cpp复制bool ForSort(const StudentScore &a, const StudentScore &b) {
if (a.ACs != b.ACs) {
return a.ACs > b.ACs; // 题数多的在前
}
if (a.score != b.score) {
return a.score < b.score; // 耗时少的在前
}
return a.name < b.name; // 姓名字典序
}
排序优先级:
- 首先按AC题数降序
- 题数相同按总耗时升序
- 前两项都相同按姓名字典序
3. 时间区间合并算法
3.1 问题分析与数据结构
处理挤奶时间区间问题,需要表示时间区间:
cpp复制struct WorkTime{
int start=0;
int end=0;
};
关键操作是合并重叠或相邻的时间区间。
3.2 区间合并算法
核心合并函数实现:
cpp复制void Tackle(WorkTime thisOne,vector<WorkTime> ×){
for(int i=0;i<times.size();i++){
if(thisOne.start >= times[i].start &&
thisOne.start <= times[i].end){
times[i].end = max(times[i].end,thisOne.end);
return ;
}
else if(thisOne.end>=times[i].start &&
thisOne.end<=times[i].end){
times[i].start = min(times[i].start,thisOne.start);
return ;
}
}
times.push_back(thisOne);
}
算法逻辑:
- 检查新区间是否与已有区间重叠
- 如果重叠则合并区间(扩展起始或结束时间)
- 不重叠则作为新区间加入
3.3 结果计算
计算最长工作时间和最长空闲时间:
cpp复制for(int i=0,last=0;i<times.size();i++){
if(i==0){
ansNull=times[i].start;
}
else{
int tempT = times[i].start - last;
ansNull = max(ansNull,tempT);
}
last = times[i].end;
ansWork = max(ansWork,times[i].end - times[i].start);
}
注意事项:
- 需要按时间顺序处理区间
- 记录前一个区间的结束时间来计算空闲时段
- 工作时间就是各区间的长度
4. 既约真分数生成算法
4.1 数学原理
既约真分数是指分子小于分母且最大公约数为1的分数。生成算法需要:
- 枚举所有可能的分母n(2到N)
- 对每个分母枚举分子m(1到n-1)
- 化简分数m/n至最简形式
4.2 分数化简实现
关键化简函数:
cpp复制void PushInto(FenShu temp,vector<FenShu> &FenShus){
for(int i=2;i<=temp.a;i++){
while(temp.b%i==0&&temp.a%i==0){
temp.b/=i;temp.a/=i;
}
}
for(auto it:FenShus){
if(temp.a==it.a && temp.b==it.b)return;
}
FenShus.push_back(temp);
}
这里使用while循环而非if,确保完全约分:
cpp复制// 错误示例:只约分一次
if(temp.b%i==0&&temp.a%i==0){
temp.b/=i;temp.a/=i;
}
// 正确做法:完全约分
while(temp.b%i==0&&temp.a%i==0){
temp.b/=i;temp.a/=i;
}
4.3 排序与输出
分数排序需要转换为浮点数比较:
cpp复制bool forSort(FenShu num1,FenShu num2){
double num11 = (double)num1.a / (double)num1.b;
double num22 = (double)num2.a / (double)num2.b;
if(num11<num22)return true;
else return false;
}
输出时注意包含0/1和1/1的情况,根据题目要求调整。
5. 卷积神经网络基础概念
5.1 核心组件解析
卷积神经网络(CNN)主要由以下层组成:
-
卷积层:使用局部连接和权重共享提取特征
- 通过滤波器(filter)扫描输入
- 每个滤波器检测特定特征(如边缘)
-
池化层:降采样减少计算量
- 最大池化:取区域最大值
- 平均池化:取区域平均值
-
全连接层:最终分类决策
5.2 与传统神经网络对比
优势:
- 参数共享大幅减少参数量
- 局部连接保留空间信息
- 自动特征提取无需手动设计
5.3 应用领域
典型应用场景:
- 图像分类(ImageNet)
- 目标检测(YOLO, Faster R-CNN)
- 图像分割(U-Net, Mask R-CNN)
实际部署考虑:
- 模型压缩(量化、剪枝)
- 硬件加速(GPU, TPU)
- 数据增强提高泛化能力
