PTA 天梯賽備賽 L1-006 連續因子 (20 分)(搜尋)

一百個Chocolate發表於2020-11-16

題目描述

L1-006 連續因子 (20 分)

一個正整數 N 的因子中可能存在若干連續的數字。例如 630 可以分解為 3×5×6×7,其中 5、6、7 就是 3 個連續的數字。給定任一正整數 N,要求編寫程式求出最長連續因子的個數,並輸出最小的連續因子序列。

輸入格式:
輸入在一行中給出一個正整數 N(1<N<2​31​​)。

輸出格式:
首先在第 1 行輸出最長連續因子的個數;然後在第 2 行中按 因子1因子2……*因子k 的格式輸出最小的連續因子序列,其中因子按遞增順序輸出,1 不算在內。

輸入樣例:

630

輸出樣例:

3
5*6*7

解題思路

感覺被這個樣例導致理解錯誤了,我原本以為是要輸出因子的個數,然後求出連續因子序列,然後通過 因子的個數*所有連續因子序列 使得結果和輸入的 N 相等,完全理解錯了…

正確思路:

連續的找因子,對於 N,我們每次對它的因子進行整除,如果可以的話,因子就加1,同時長度也加1,最後不能整除後,就返回此時連續因子的長度,同時更新左邊最開始的因子。那麼迭代之後,我們就能找到最長長度的連續因子序列,然後也能得到連續因子序列的起始值,這樣我們最終結果就能得到了。

另外,注意點是,如果長度一直為0,那麼代表這個數為素數,那麼特判一下,直接輸出

1
N(代表輸入的數字)

提交程式碼

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
ll dfs(ll n,ll b,ll len){ //剩餘被除數,因子,長度
    if(n%b==0)
        return dfs(n/b,b+1,len+1);
    return len;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>n;
    ll len=0;
    ll left=0;
    for(ll i=2;i*i<=n;i++){
        if(n%i==0){
            ll res = dfs(n,i,0);
            if(res>len){
                len=res;
                left=i;
            }
        }
    }
    if(len==0)
        cout<<1<<endl<<n<<endl;
    else{
        cout<<len<<endl;
        for(ll i=1;i<=len;i++){
            if(i==1) cout<<left+i-1;
            else cout<<"*"<<left+i-1;
        }
        cout<<endl;
    }
    return 0;
}

提交結果

學如逆水行舟,不進則退

相關文章