1096 Consecutive Factors (20分)这道题不像是求质因子,像two pointers

本题和A1085求完美数列差不多,找连续的最大区间,且i和j的位置都不固定,用二重循环实现

#include <iostream>
#include <cmath>
using namespace std;
long int num, temp;
int main(){
    
    
    cin >> num;
    int first = 0, len = 0, maxn = sqrt(num) + 1;
    for (int i = 2; i <= maxn; i++) {
    
                     //初始位置固定
        int j; 
        temp = 1;
        for (j = i; j <= maxn; j++) {
    
                     //向后找连续因子
            temp *= j;
            if (num % temp != 0) break;
        }
        if (j - i > len) {
    
    
            len = j - i;
            first = i;
        }
    }
    if (first == 0) {
    
    
        cout << 1 << endl << num;                  //输出最小的连续因子,是1不是n
    } else {
    
    
        cout << len << endl;
        for (int i = 0; i < len; i++) {
    
    
            cout << first + i;
            if (i != len - 1) cout << '*';
        }
    }
    return 0;
}

#include<bits/stdc++.h>
using namespace std;
int main()
{
    
    
    int n,first=0,maxn=0,sqr,j;
    cin>>n;
    sqr=(int)sqrt(n*1.0)+1;                 //大于sqr的因子最多有一个,如果n是素数,那就是自己,或者6=2*3,12=3*4其实是2*2*3
    for(int i=2;i<=sqr;i++)
    {
    
    
        if(n%i==0)
        {
    
    
            int temp=i;
            for(j=i+1;j<=sqr;j++)
            {
    
    
                temp*=j;
                if(n%temp!=0)
                    break;
            }
            if(j-i>maxn)
            {
    
    
                maxn=j-i;
                first=i;
            }
        }
    }
    if(first==0)
        printf("1\n%d",n);
    else{
    
    
        printf("%d\n",maxn);
        for(int i=first;i<first+maxn;i++)
        {
    
    
            printf("%d",i);
            if(i!=first+maxn-1)
                printf("*");
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42835526/article/details/113449747