《算法每日一题(1)--- 连续因子》
文章目录
- [《算法每日一题(1)--- 连续因子》](#《算法每日一题(1)--- 连续因子》)
- 前言
- 一、连续因子---2016年天梯赛
-
- [1.1 题目](#1.1 题目)
- [1.2 算法原理](#1.2 算法原理)
- [1.3 代码](#1.3 代码)
- 总结
前言
本系列为笔者的练习分享,题目难度适中适合刚入门(笔者也是刚入门)算法的同学学习,希望能和大家见证算法编程和逻辑思维的进步

一、连续因子---2016年天梯赛
1.1 题目

1.2 算法原理
首先我们要明确我们要输出的是最小的连续因子序列 ,也就是如果有两端长度相同的序列取小的那一段就可以了
接下来我们要解决两个问题:
(1) 如何找出这段序列:
解:这个时候我们就可以借鉴求解一个数是否是素数的方式 ,既一个数x如果有两个因子a和b,那必然有一个因子是小于等于根号x的 ,那我们便可以遍历2到根号x来求解连续因子
(2) 如何输出这一段序列
解:我们可以定义一个变量st每次求出一段序列便把序列头赋值给st,依照最后求出的长度使用一个for循环遍历输出就可以了
1.3 代码
c
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n;
cin >> n;
//当n是合数时
int st = 0; //记录序列头
int ans = 0; //序列的最长长度
for (int i = 2; i <= sqrt(n); i++)
{
int j = i;
int len = 0; //当前连续序列的长度
int result = 1;
if (n % i == 0)
{
while (1)
{
result *= j;
if (n % result != 0) //不满足
break;
len++;
if (ans < len) //序列长度相同取前面小的一段:更新长度 + 因子序列的开头
{
ans = len;
st = i;
}
j++;
}
}
}
//如果n是质数
if (ans == 0)
{
ans = 1;
st = n;
}
cout << ans << endl;
for (int i = 0; i < ans; i++)
{
if (i > 0)
cout << "*";
cout << st + i;
}
cout << endl;
return 0;
}
总结
今天就到这里,大家明天见