Pta连续因子

这道题主要要看看他的最小的因子可能连续的出现的区域在哪里,和知道素数因子只有自己和1

假设极端的想法,要是只有两个因子,例如4*5=20; int (sqrt(20)=4;要是再多几个因子的话就不会这么靠近他的sqrt。因为越多因子因该是开越多次方,但是我们要找的是因子最小的所以一定是小于sqrt(n);

要是是素数就输出1和他的连续的因子本身。

过程:

介绍变量:s(因子累乘的积),start(确定子序列开始的位置),l(连续因子的个数),j(记录i开始到是s>n停止),i(最小因子所在的区域)

开始的时候先去判断n是否是素数,要是不是素数那么就去他们的区域里面找最小的那个数,然后初始化s(用来存放因子的积),然后用一个循环从i开始直到s<=n;为止,在里面就是去判断因子是否和n整除,要是整除且开始因子个数要大于在此之前累加的因子个数,要是都成立就更新开始值(因为i不会变在找连续的个数的时候

#include<bits/stdc++.h>
using namespace std;
bool prime(int n){
    int flag = 1;
    for(int i = 2;i <= sqrt(n);i++){
        if(n%i==0)flag=0;
    }
    return flag;
}
int main(){
    int n;
    cin >> n;
    int s,j,l=0,start;
    if(prime(n)){
        cout << 1 << endl;
        cout<< n;
    }else{
        for(int i = 2;i < sqrt(n);i++){
            s = 1;
            for(j = i;s <= n;j++){
                s*=j;
                if(n%s==0&&j-i+1>l){
                    l = j-i+1;
                    start = i;
                }
            }
        }
        cout << l << endl;
        for(int i = start;i < l+start;i++){
            if(i == start){
                cout << i;
            }else cout << '*'<<i;
        }
    }
    return 0;
}

)和更新最长长度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值