【一只蒟蒻的刷题历程】 【PTA】 A1096 连续质因数 (模拟)

在正整数N的所有因子中,可能存在几个连续的数字。例如,630可以分解为3×5×6×7,其中5、6和7是三个连续的数字。现在给定任何正数N,您应该找到最大数量的连续因子,并列出连续因子的最小序列。

输入规格:

每个输入文件包含一个测试用例,该用例给出整数N(1 <N <2‐31)。

输出规格:

对于每个测试用例,请在第一行中打印最大连续因子数。然后在第二行中,以格式factor [1] * factor [2] * … * factor [k]来打印连续因子的最小序列,其中因子以升序排列,不包括1 。

输入样例:

630

样本输出:

3


思路:

只用判断根号n就可以了,大于根号n不可能是n的质因数,所以判断到 i * i <= n 就可以了,用一个j从i开始,不断增加,直到乘积不能被n整除(取余为0)就退出


代码:

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;  
int main()
{
   long long n,anslen=0,ansfirst; //不想分析直接都是longlong 
   long long temp=1,j,len=0;
   cin>>n;
   for(long long i=2;i*i<=n;i++) //longlong最后一个测试点 
   {
   	   temp=1,j=i,len=0; //质因数乘积 , j从i开始增加 , 连续质因数的长度 
   	   while(1)
   	   {
   	   	  temp*=j;   
   	   	  if(n%temp!=0) break; //不能整除,说明不是正确的质因数乘积 
   	   	  j++; //j增加 
   	   	  len++; //长度增加 
   	   	  if(len>anslen)  //如果比anslen长,更新长度,更新连续质因数的头一个数 
   	   	  {
   	   	  	 anslen=len;
   	   	  	 ansfirst=i;
		  }
	   }
   }
   if(anslen==0)  //测试点5 
   {
   	cout<<1<<endl<<n; //一个数 就是本身 
   	return 0;
   }
   cout<<anslen<<endl; //输出长度 
   for(int i=ansfirst;i<ansfirst+anslen;i++) //从连续的第一个数开始,往后长度加anslen 
   {
   	  cout<<i;
   	  if(i+1<ansfirst+anslen) //不是最后一个数字,就输出* 
   	  cout<<'*';
   }
  return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值