PAT 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

一開始看錯題,以爲是一定是連續的因子。


首先知道要找到因子,可以把這個數開方,在前一半找和後一半找結果是一樣的。因爲要求是最長的連續因子,所以我們從長度最長開始找、逐漸變短。


只要輸入的數對找出因子的乘積取模是 0,那麼就符合要求。

#include <cstdio>
#include <cmath>

int main()
{
    int num, len, lim;
    scanf("%d", &num);
    lim = sqrt(num);

    bool flag = false;
    int start;
    for (len = 12; len > 0; --len)
    {
        for (start = 2; start <= lim; ++start)
        {
            long long ans = 1;
            for (int i = start; i <= start + len - 1; ++i)
                ans *= i;
            if (num % ans == 0)
            {
                flag = true;
                break;
            }
        }
        if (flag)
            break;
    }
    if (flag)
    {
        printf("%d\n", len);
        for (int i = start; i <= start + len - 1; ++i)
            printf(i == start ? "%d" : "*%d", i);
    }
    else
        printf("1\n%d", num);
    printf("\n");
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章