C++编程题,超时原因不明

问题遇到的现象和发生背景

题目:
一个数的约数也称为因子,比如1是6的因子,2是6的因子,6是6的因子。

质数只有两个因子,1和它本身

现在定义一种新的质数,三质数,三质数只有三个不同的因子。比如4是三质数,因为它有1,2,4三个因子。比如6不是三质数,因为6有1,2,3,6四个因子。现在有一些数,你需要判断他们是不是三质数。

有T组数据,每组一个数,是三质数输出YES,不是输出NO,一个一行

样例输入:
3
4
5
6

样例输出:
YES
NO
NO

数据范围:1<=T<=10^3;对于每个n,1<=n<=10^12

问题相关代码,请勿粘贴截图
#include<bits/stdc++.h>
using namespace std;
int main(){
    int T;
    cin>>T;
    for(int i=0;i<T;i++){
        long long num,yz=0;
        cin>>num;
        for(int j=1;j<=num;j++){
            if(num%j==0)yz++;
        }
        if(yz==3){
            cout<<"YES"<<endl;
        }else{
            cout<<"NO"<<endl;
        }
    }
    return 0;
}

运行结果及报错内容

img

我想要达到的结果

解决题目

算法太简单,结果应该是对的,就是慢点。
参考判断质数的算法,似乎是算到sqrt(num)就可以。

这样的题目应该是要求一次性输入,利用动态数组存储,再统一判断的


#include<iostream>
using namespace std;
int main() {
    int T;
    cin >> T;
    long long* num = new long long[T];
    for (int i = 0; i < T; ++i)
        cin >> num[i];
    for (int i = 0; i < T; i++) {
        long long yz = 0;
        for (int j = 1; j <= num[i]; j++) {
            if (num[i] % j == 0)yz++;
        }
        if (yz == 3) {
            cout << "YES" << endl;
        }
        else {
            cout << "NO" << endl;
        }
    }
    delete[] num;
    return 0;
}

试试这样改下:

#include <iostream>
using namespace std;
int main(){
    int T,j,yz;
    cin>>T;
    while(T--){
        long long num,tmp;
        cin>>num;
        tmp = num/2;
        for(j=2,yz = 2;yz < 4 && j<= tmp;j++){//修改
            if(num%j==0) yz++;
        }
        if(yz==3){
            cout<<"YES"<<endl;
        }else{
            cout<<"NO"<<endl;
        }
    }
    return 0;
}

个人建议:
输入用快读
顶上加个o2或者o3