L1-006 连续因子

image


本来看到题目,我的第一反应是for循环找出N的所有因子,把他们存在一个数组里,然后把他们相乘,并排列成最长的连续因子,但是这样实现起来好像有点复杂,想到这是L1的题目,应该不会这么难,应该是我思路错了。

正解

用for循环,i从2开始到sqrt(N),记录从i开始的最长连续因子的个数count,如果比之前的max还要大,那么max=count,连续因子的起始位置start=i,遍历过后,start就是最长连续因子的起点,max是最长连续因子的长度,输出即可。

代码


#include<iostream>
#include<math.h>
using namespace std;

int main()
{
    int n,k,i,j,count,max_count=0,start;
    cin>>n;
    for(i=2;i<=sqrt(n);i++)
    {
        count=0;
        j=i;
        k=n;
        while(k%j==0)
        {
            k=k/j;
            j++;
            count++;
        }
        if(max_count<count)
        {
            max_count=count;
            start=i;
        }
    }
    if(max_count)
    {
        cout<<max_count<<endl;
        for(i=0;i<max_count-1;i++)
        {
            cout<<start+i<<"*";
        }
        cout<<start+i<<endl;
    }
    else
    {
        cout<<1<<endl<<n<<endl;
    }
    return 0;
}

注意

  • 最后要有一个if语句,如果N是素数,比如11,那只用输出1\n11,如果不是素数,就用for循环输出最长连续因子
  • 一开始提交的时候部分错误,有几组数据超时了,经过分析,是因为max没有赋初值,默认是一个很大的值,如果N是素数,在找最长连续因子的时候max的值不会被修改,那么在最后输出结果的时候会输出很长很长,导致超时。
posted @ 2022-06-26 22:46  ssuxi  阅读(259)  评论(0编辑  收藏  举报