L1-006. 连续因子

一个正整数N的因子中可能存在若干连续的数字。例如630可以分解为3*5*6*7,其中5、6、7就是3个连续的数字。给定任一正整数N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式:
输入在一行中给出一个正整数N(N在1到2的31次方之间)
输出格式:
首先在第1行输出最长连续因子的个数;然后在第2行中按“因子1*因子2*……*因子k”的格式输出最小的连续因子序列,其中因子按递增顺序输出,1不算在内。
输入样例:
630
输出样例:
3
5*6*7
Note1:怎么找出因子,就需要不停的从1取余到sqrt(N)为止,再进而找出是否有连续的且输出最小还得统计因子的个数。可以利用两个循环,第一个标记连续因子序列首数,第二个用来求序列首数后的序列。最后一个循环输出这个序列。所以在不停的比较当中,需要设置变量current_head和current_longest分别记录序列首和序列长度。最后用for循环输出这个序列,问题就得到解决了。关键在于要理清之间两个循环之间的关系,以及设置条件来判断是否为最小最长连续因子序列。

Note2:那是第一遍的得做法和思路,比较暴力,容易看懂。第二段是复习的时候想出来的,逆向方法,需要一定时间去理解。
1、因为是连乘,第一个应该想到的是阶乘。2的31次方是2147483648,刚好处于12!和13!之间,也就是说连续因子的最长长度也就12位数(13位就会比13!大),所以可以倒序,从最长直接的连续因子序列开始往下找。
2、题目要求最长连续因子序列中最小的那一种,所以每次执行循环都从2开始,寻找能被N整除的序列,找到了就输出。
3、当遍历完所有长度,只剩下len=1时,循环就相当于寻找最小的因为活着判断是否为质数了。

#include<stdio.h>
#include<math.h>
int isprime(int N)
{
    int i;
    for (i=2; i<sqrt(N)+2; i++){
        if (N%i==0) return 0;
    }return 1;
}
int main()
{
    int N, M, i, j, k, count, current_longest=0, current_head;
    scanf("%d", &N);
    if (isprime(N)) printf("1\n%d", N);//判断是否为质数,是的话不走循环直接输出
    else{
        for (i=2; i<sqrt(N)+2; i++){//严格意义上讲需要循环到<sqrt(N)+2,实际上到sqrt(N)就行了
            count = 0;//每一次循环都要对count初始化
            M = N;//循环后M的值变了,所以也需要重新赋值
            for (j=i; j<sqrt(N)+2; j++){
                if (M%j==0){
                    count ++;//标记长度
                    M /= j;//标记序列首
                }else{
                    if(count>current_longest){//最小输出序列
                        current_longest = count;//记录序列长度
                        current_head = i;//记录序列守
                    }
                    break;//跳出第二个for循环
                }
            }
        }
        printf("%d\n", current_longest);//输出序列长度
        for (k=current_head; k<current_head+current_longest; k++){
            printf("%d", k);
            if (k!=current_head+current_longest-1) putchar('*');//注意最后一个是长度减一
        }
    }
    return 0;
}
#include<stdio.h>
#include<math.h>
int main()
{
    int i, N, len, head;
    scanf("%d", &N);
    for (len=12; len>=1; len--){
        for (head=2; head<=sqrt(N); head++){
            long long int mult = 1;
            for (i=head; i<=head+len-1; i++)//从head开始第12个数刚好是len+head-1
                mult *= i;//计算连续因子乘积
            if (N%mult == 0){//若整除了就是最长连续因子序列
                printf("%d\n%d", len, head);//这一行输出了序列首因子
                for (i=head+1; i<=head+len-1; i++)
                    printf("*%d", i);
                return 0;
            }
        }
    }
    printf("1\n%d", N);
    return 0;
}
阅读更多
版权声明: https://blog.csdn.net/qq_37701948/article/details/79960225
文章标签: C语言
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭