看我!!!!!!
2023-11-11 14:48:43
发布于:浙江
17阅读
0回复
0点赞
很水的普及/提高-
时间复杂度O(n^2)
第一次提交用暴力枚举法居然没有tle
首先看数据范围
好水啊
这说明暴力枚举肯定能过;
如此之水的数据那必须得用暴力
首先
定义变量找出n的第一个质因数
本题数据极水,所以可以直接暴力枚举。
题干认为n只有一组质因数,所以找出n的其中一个质因数之后就只需要n➗其中一个质因数后就可以判断的得数是否为质数。查找第一个质因数的代码:
for(int i = 2;i < n;i++){//暴力枚举
if(n % i == 0){//如果i是n的因数
for(int j = 2;j < i;j++){//判断i是否为质数
if(i % j == 0){
f = 1;
break;//break只影响到内层循环!!!!!!
}
}
而当我们拥有第一个质因数的时候(即f = 0),就可以写第二个判断套循环:判断n / i是否是一个质数。同样使用循环遍历小于j大于等于2的所有数判断是否为质数。该段代码如下:
for(int j = 2;j < i;j++){//判断n/i是否为质数
if(i % j == 0){
f = 1;
break;
}
}
if(f == 0){//如果n/i也是质数
cout<<n / i;//直接输出并退出循环
break;
}
最后不要忘记continue跳出本次循环。
完整代码如下:
#include <iostream>
using namespace std;
int n,f = 0;
int main(){
cin>>>n;
for(int i = 2;i < n;i++){//暴力枚举
if(n % i == 0){//如果i是n的因数
for(int j = 2;j < i;j++){//判断i是否为质数
if(i % j == 0){
f = 1;
break;
}
}
if(f == 0){//如果i为质数
for(int j = 2;j < i;j++){//判断n/i是否为质数
if(i % j == 0){
f = 1;
break;
}
}
if(f == 0){//如果n/i也是质数
cout<<n / i;//直接输出并退出循环
break:
}
else continue;
}
else continue;
}
}
return 0;
}
感觉要的时间有点长,所以还是别贴这个了吧
本代码已做防抄袭处理:)(共四处)
这里空空如也
有帮助,赞一个