【一隻蒟蒻的刷題歷程】 【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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章