7-4 连续因子 (20 分)

一个正整数 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

这里我说一下我在做这题的时候遇到的一些问题,不知道大家也有没有遇到过类似的问题

首先就是最开始读题的时候理解题目意思理解错了,我以为是先输出最长连续因子的个数,然后在输出乘积最小的连续因子,然后我就发现这样只对了一两个案例,然后我就去网上看了一下别人对这题的理解,发现我一开始就理解错误题目的意思了,实际题目的意思应该是先输出最长连续因子的个数,然后再输出这个连续因子,如果有两个连续因子的个数相同,则应该输出乘积较小的那个连续因子

其次就是我做到后面,一直卡在19分,我也一直跟别人在探讨我的代码,然后一直都是第六个案例运行超时,找了几个小时都没有找出问题,然后今天在做新的题目的时候有遇到类似的问题,结果就发现在判断素数的时候,我的代码是

int prinum(int num)
{
    for(int i=2;i*i<=num;i++)
    {
        if(num%i==0) return 0;
    }
    return 1;
}

用这个代码去判断素数的时间会比下面这一段更长

int prinum(int num)
{
    for(int i=2;i<=sqrt(num);i++)
    {
        if(num%i==0) return 0;
    }
    return 1;
}

原因是i*i<=num的运行时间比i<sqrt(num)要长,所以才会导致我的代码有一个案例会运行超时

下面是我做题写的代码

#include<bits/stdc++.h>
#include<math.h>
using namespace std;
int prinum(int num)
{
    for(int i=2;i<=sqrt(num);i++)
    {
        if(num%i==0) return 0;
    }
    return 1;
}
int main()
{
    int mid,start,max=0;
    int n,j;
    scanf("%d",&n);
    for(int i=2;i<=sqrt(n)+1;i++)
    {
        if(n%i==0)
        {
            mid=n/i;
        for(j=i+1;j<=sqrt(n)+1;j++)
        {
            if(mid%j==0)
            {
                mid/=j;
            }
            else break;
        }
        if(j-i>max)
        {
            max=j-i;
            start=i;
        }
        }
    }
    if(prinum(n))
    {
        printf("1\n");
        printf("%d\n",n);
    }
    else
    {
    printf("%d\n",max);
    for(int i=start;i<start+max;i++)
    {
        printf("%d",i);
        if(i!=start+max-1) printf("*");
        else printf("\n");
    }
    }
    return 0;
}