l1-006. 连续因子java_L1-006. 连续因子(思想较为复杂)

一个正整数N的因子中可能存在若干连续的数字。例如630可以分解为5×6×7,其中5、6、7就是3个连续的数字。给定任一正整数N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。

输入格式:

输入在一行中给出一个正整数N(1

输出格式:

首先在第1行输出最长连续因子的个数;然后在第2行中按“因子1因子2……*因子k”的格式输出最小的连续因子序列,其中因子按递增顺序输出,1不算在内。

输入样例:

630

输出样例:

3

5×6×7

分析:N的范围是 1

其实并不需要得到N的因子分解,只需要取其中的连续因子的部分即可。实现思路为,从最大长度12开始枚举,因子的范围是[2, sqrt(n)+1)],只需要判断一段连续因子的乘积是否为N的因子即可。长度从大到小,因子从小到大枚举,因此最先得到的序列一定是最长的。且最小的。

#include

#include

using namespace std;

//一个数,质数

int main()

{

bool isFound;

long long int n,ans;

int len,END,start=2;//max表示最大的因数,重要,要关注特殊情况,144,6,

while(cin>>n){

isFound=false;

END=sqrt(n)+1;

for (int i=12;i>=1;i--){ //i表示最最长序列个数,不会超过12,非常重要!注意=1的边界情况,可能所有因子都是不连续的

for (start=2;start<=END;start++){

ans=1;

for (int j=start;j-start<=i-1;j++){ //j表示最左边的节点

ans*=j;

}

//cout<

if(n%ans==0){

isFound=true;

len=i;

break;

}

}

if(isFound==true) break;

}

if(isFound==true){

cout<

for (int i=0;i

cout<

}

cout<

}

else{

cout<

cout<

}

}

return 0;

}

第二种方法:直接进行

#include

#include

using namespace std;

int main()

{

int num,count,temp,start,product;

while(cin>>num)

{

count=0,temp=0,start=0;

for (int i=2; i

{

product=1;

for (int j=0; true; j++)

{

product*=(i+j);

if(num%product==0)

{

temp=j+1;//j是i之后的数字,所以要加1

}

else

{

break;

}

}

if(count

{

count=temp;//cout<

start=i;

}

//cout<

temp=0;

}

if(count!=0)

{

cout<

for (int i=start; i

{

if(i==start)

cout<

else

cout<

}

}

else

{

cout<

cout<

}

}

return 0;

}

第一种纠结之处

1.不仅要关注是质数的情况,更要关注所有因数都不连续,此时要输出的最小序列不是他本身,如357=105,所以要考虑i=1的情况

2.数字相乘可能溢出,使用long long int

3.先解决范围,缩小到12使得复杂度大大减小,,这里的12是12个因数,这种缩小思路很难得

3.三重循环之间的变量不要绕晕了

第二种纠结之处

1.刚开始从2进行遍历,若连续几个都为因子则数量增加,错误在于是因子,但是乘起来并不一定是因子。这里可以看到通过了四个用例,看来内部用例较小

2.特殊情况,质数,则count=0,输出要特殊列出

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值