L1-006. 连续因子

L1-006. 连续因子

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越

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

输入格式:

输入在一行中给出一个正整数N(1<N<231)。

输出格式:

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

输入样例:
630
输出样例:
3
5*6*7

分析:题目告诉我们N小于2的31次方,联想到阶乘,使用我们可以确定最大的因子个数不会超过12个,且所有因子的大小肯定不会超过sqrt(N),
所以我们就假设最大因子长度为12,11,10.......,1的时候从2到sqrt(N),看看最后得到出来的阶乘数字是不是N的因子,如果是,那么我们就找到啦,
我觉得我没有说清楚,我也不知道大家有疑惑的话可以看看我的代码
ps:找到的最长因子序列的乘积一定是N的因子
当N为素数的时候,最长因子序列长度为1,序列为其本身
这是两个需要注意的地方
具体请参考这个小姐姐的博客:http://blog.csdn.net/liuchuo/article/details/51989000
这题写了两个小时,发现还是小姐姐这个方法比较好。。。。

具体代码:

复制代码
 1 #include<stdio.h>
 2 #include<math.h>
 3 #include<string.h>
 4 int fun(int n)//判断素数
 5 {
 6     int i;
 7     for(i=2;i<=sqrt(n);i++)
 8     {
 9         if(n%i==0)
10         {
11             return 0;
12         }
13     }
14     return 1;
15 }
16 int main()
17 {
18     int n,start,len,max,i,flag=0;
19     while(~scanf("%d",&n))
20     {
21         flag=0;
22         if(fun(n)==1)
23         {
24             printf("1\n%d",n);
25             continue;
26         }
27         max=(int)(sqrt(n));
28         for(len=12;len>=1;len--)//根据因子序列的长度来循环
29         {
30             for(start=2;start<=max;start++)//所有因子的大小肯定小于sqrt(n)
31             {
32                 long long int ans=1;
33                 for(i=start;i<=len+start-1;i++)
34                 {
35                     ans=ans*i;//得到这个序列的乘积
36                 }
37                 if(n%ans==0)//如果这个乘积是n的因子,那么这个序列就是我要找的序列
38                 {
39                     printf("%d\n",len);
40                     for(i=start;i<=len+start-1;i++)
41                     {
42                         printf("%d",i);
43                         if(i!=len+start-1)
44                         {
45                             printf("*");
46                         }
47                         else
48                         {
49                             printf("\n");
50                         }
51                     }
52                     flag=1;//找到目标序列的标志
53                     break;
54                 }
55             }
56             if(flag==1)//找到了目标序列,跳出循环
57                 break;
58         }
59     }
60     return 0;
61 }
复制代码

 





posted @   西*风  阅读(305)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示