1096. Consecutive Factors (20)-PAT(c++)测试点分析

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;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值