70分求助 TLE#7 8 9
查看原帖
70分求助 TLE#7 8 9
726735
Sirius_M楼主2022/10/17 19:23
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
int t,n;
/*
情况1:能被7整除
情况2:数字中带有7
情况3:因数出现以上两者之一的情况
输出:从当前数字开始往后一个一个枚举 直到枚出ok的
*/
int len(int a){
    int ans=1;
    while(a/=10) ans++;
    return ans;
}
bool ok(int a){//判断是否能选数
    if(a%7==0) return 0;
    if(a<7) return 1;
    int k=a,l=len(k),sum;
    while(l--){
        sum=k-(k/10*10);//求当前最低位
        if(sum!=0&&sum==7) return 0;
        k/=10;
    }
    k=a;
    for(int i=2;i<=sqrt(k);i++){//分析它的因数
        if(k%i==0){//对于其因数
            if(!ok(i)||!ok(k/i)) return 0;
        }
    }
    return 1;
}
int ans(int a){
    a++;
    while(!ok(a)) a++;
    return a;
}
int main(){
    cin>>t;
    while(t--){
        cin>>n;
        if(ok(n)) cout<<ans(n)<<endl;//输出下一个数
        else cout<<"-1"<<endl;
    }
    return 0;
}

主要思路都写在代码里了。不太会分析时间复杂度,求大佬分析 + 帮调,感谢!!!

2022/10/17 19:23
加载中...