《算法每日一题(1)--- 连续因子》
《算法每日一题(1)— 连续因子》
文章目录
- 《算法每日一题(1)--- 连续因子》
- 前言
- 一、连续因子---2016年天梯赛
- 1.1 题目
- 1.2 算法原理
- 1.3 代码
- 总结
前言
本系列为笔者的练习分享,题目难度适中适合刚入门(笔者也是刚入门)算法的同学学习,希望能和大家见证算法编程和逻辑思维的进步
一、连续因子—2016年天梯赛
1.1 题目
1.2 算法原理
首先我们要明确我们要输出的是最小的连续因子序列,也就是如果有两端长度相同的序列取小的那一段就可以了
接下来我们要解决两个问题:
(1) 如何找出这段序列:
解:这个时候我们就可以借鉴求解一个数是否是素数的方式,既一个数x如果有两个因子a和b,那必然有一个因子是小于等于根号x的,那我们便可以遍历2到根号x来求解连续因子
(2) 如何输出这一段序列
解:我们可以定义一个变量st每次求出一段序列便把序列头赋值给st,依照最后求出的长度使用一个for循环遍历输出就可以了
1.3 代码
#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;
}
总结
今天就到这里,大家明天见