• 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
    %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
    ",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("
    ");
    50                         }
    51                     }
    52                     flag=1;//找到目标序列的标志
    53                     break;
    54                 }
    55             }
    56             if(flag==1)//找到了目标序列,跳出循环
    57                 break;
    58         }
    59     }
    60     return 0;
    61 }




  • 相关阅读:
    Animation用法
    英文口语及书写常用句型汇总1
    Jqplot使用总结之二(双Y轴)
    SqlServer扩展存储过程
    SQL Server常见基础操作
    C# 利用ITextSharp导出PDF文件
    go常量
    ARP协议
    go数组
    go基本数据类型
  • 原文地址:https://www.cnblogs.com/yinbiao/p/8544640.html
Copyright © 2020-2023  润新知