题目:
一个数的约数也称为因子,比如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;
}
解决题目
算法太简单,结果应该是对的,就是慢点。
参考判断质数的算法,似乎是算到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