[code] PTA 胡凡算法筆記 DAY049

題目 A1096 Consecutive Factors

在這裏插入圖片描述

  • 題意
    輸入數字N,求一段連續的整數序列,其乘積爲N的因子。求最長的連續序列,輸出長度及序列。如果存在多個序列長度相同的情況,輸出最小的序列。

  • 思路
    首先需要確定思路,是採用構造連續整數乘積判斷是否能被n整除的方式。然後確定範圍,最大爲sqrt(n)。然後再就是存儲結果的方式,採取存儲連續序列的第一個數和長度的方式,遇到長度更大的情況時更新,這樣即可以保證更新的方便也可以滿足獲取的是長度相同情況下最小的序列。

  • Code in C++

#include <cstdio>
#include <cmath>

int main()
{
    long long n;
    scanf("%lld", &n);
    long long sqrn = std::sqrt(n), lenth = 0, start = 0;
    // 遍歷連續因子第一個數從[2,sqrt(n)]
    for (int i = 2; i <= sqrn; ++i)
    {
        long long j = i, tmp = 1;
        while(1)
        {
            tmp *= j;
            if (n % tmp != 0) break;
            if (j - i + 1 > lenth)
            {
                lenth = j - i + 1;
                start = i;
            }
            ++j;
        }
    }

    // 如果無解,只有自身是自己的因子
    if (lenth == 0)
    {
        printf("1\n%lld", n);
    }
    else
    {
        printf("%lld\n", lenth);
        for (int i = 0; i < lenth; ++i)
        {
            if (i > 0) printf("*");
            printf("%lld", start + i);
        }
    }
    return 0;
}


小結

  1. 確定因子遍歷範圍
  2. 構造連續整數乘積作爲因子去判斷
  3. 利用存儲第一個整數和長度的方式保存結果
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章