1096. Consecutive Factors (20)-PAT(c++)测试点分析
题目:
Among all the factors of a positive integer N, there may exist several consecutive numbers. For example, 630 can be factored as 3×5×6×7, where 5, 6, and 7 are the three consecutive numbers. Now given any positive N, you are supposed to find the maximum number of consecutive factors, and list the smallest sequence of the consecutive factors.
Input Specification: Each input file contains one test case, which gives the integer N (1<N<2 31 ).
Output Specification: For each test case, print in the first line the maximum number of consecutive factors. Then in the second line, print the smallest sequence of the consecutive factors in the format factor[1]factor[2]…*factor[k], where the factors are listed in increasing order, and 1 is NOT included.
Sample Input:
630
Sample Output:
3
5*6*7
思路:用一个vector数据暂存一次连续的因子,用另一个vector数组存最长因子。每次i能整除N后继续判断后面连续的数之积能否继续整除N,这样就只需要两重循环,而且第二重循环也很短。
测试点5:最小N和测试点6:最大素数要后面单独判断,因为要输出原数,而你只循环到了sqrt(N)。(不用sqrt(N)测试点6会超时)
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int main()
{
int x,t,a, max = 0,cnt=0;
cin >> x;
vector<int>arr;//用来暂存连续因子
vector<int>arr2;//用来存最长连续因子
for (int i = 2; i <= sqrt(x); i++)
{
if(x%i!=0)
continue;
a = i;
t = i;
cnt = 0;
while (x%t == 0)//while循环寻找当前i为首的连续因子
{
cnt++;
arr.push_back(a);
a++;
t *= a;
}
if (cnt>max)
{
max = cnt;
arr2.clear();//更新max要清除该数组
for (int j = 0; j < arr.size(); j++)
{
arr2.push_back(arr[j]);
}
}
arr.clear();
}
if(arr2.size()==0)//如果arr2未被赋值,则为素数,输出原数即可
{
cout<<1<<endl<<x;
return 0;
}
cout << arr2.size() << endl;
for (int i = 0; i < arr2.size(); i++)
{
if (i != 0)
cout << '*';
cout << arr2[i];
}
return 0;
}