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
Note:怎么找出因子,就需要不停的从1取余到sqrt(N)为止,再进而找出是否有连续的且输出最小还得统计因子的个数。可以利用两个循环,第一个标记连续因子序列首数,第二个用来求序列首数后的序列。最后一个循环输出这个序列。所以在不停的比较当中,需要设置变量current_head和current_longest分别记录序列首和序列长度。最后用for循环输出这个序列,问题就得到解决了。关键在于要理清之间两个循环之间的关系,以及设置条件来判断是否为最小最长连续因子序列。

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

猜你喜欢

转载自blog.csdn.net/qq_37701948/article/details/79960225