【GPLT】L1-006 连续因子
- 2019 年 11 月 8 日
- 筆記
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42449444/article/details/88615969
题目描述:
一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式:
输入在一行中给出一个正整数 N(1<N<231)。
输出格式:
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1*因子2*……*因子k
的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。
输入样例:
630
输出样例:
3 5*6*7
解题思路:
连续因子最大值一定不会超过sqrt(N),maxcnt是用来记录连续因子长度的,start为第一个连续因子的所在下标,用while语句来寻找最长连续因子。需要注意的是若输入的N是素数,则连续因子就是其本身,连续长度为1。
AC代码:
#include <bits/stdc++.h> using namespace std; int main() { int N; cin >> N; int cnt = 0, maxcnt = 0, start = 0; //maxcnt为连续因子长度,start为第一个连续因子 for(int i = 2; i <= sqrt(N); i++) { int temp = N; cnt = 0; int j = i; while(temp%j == 0) { temp /= j++; cnt++; } if(cnt > maxcnt) //更新连续因子长度 { maxcnt = cnt; start = i; } } bool isVirgin = true; //判断是不是第一次 if(maxcnt == 0) //对于素数而言,连续因子就是其本身,连续长度为1 { cout << 1 << endl << N; } else { cout << maxcnt << endl; for (int i = 0; i < maxcnt; i++) { if(isVirgin) { cout << start+i; isVirgin = false; } else { cout << "*" << start+i; } } } return 0; }