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;
}