- 写在前面:从今天开始做PTA上的天梯赛题目集,坚持做题,坚持用博客记录难题,加油!!!
1. 题目
一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式:
输入在一行中给出一个正整数 N(1<N<2 ^31)。
输出格式:
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1因子2……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。
输入样例:
630
输出样例:
3
5*6*7
2.解题思路
参考代码注释
3.代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int max1=0;//用于记录最长的因子序列的个数
int pos=0;//用于记录连续因子开始的那个数
//为保证是最小序列,需要从小往大遍历,
//又因为不可能存在由比sqrt(n)大的数组成的连续序列且题目中要求序列不包括1,所以应从2到sqrt(n)遍历
for(int i=2;i<=sqrt(n);i++)
{
int n1=n;
int max2=0;
int j=i;
while(n1%j==0)//当j可以被n1整除时,看j+1,j+2...是否可以被n1整除,直到不能被整除为止
{
n1=n1/j;
j++;
max2++;
}
if(max2>max1)//更新max1和pos的值
{
max1=max2;
pos=i;
}
}
if(max1>0)//如果max1>0,输出相应内容
{
cout<<max1<<endl;
for(int i=pos;i<pos+max1-1;i++)
{
cout<<i<<"*";
}
cout<<pos+max1-1;
}
else if(max1==0)//当max1的值为0时,说明n为素数,素数只能被1和本身整除,此时应输出n
{
cout<<"1"<<endl;
cout<<n<<endl;
}
return 0;
}