L1-006. 连续因子

懵懂的女人 提交于 2020-03-11 10:25:42

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 }

 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!