17 条题解
-
13
#include <iostream> using namespace std; int main() { int a; cin >> a; int b = 0; for (int i = 2; i <= a; i++) { int c = 1; for (int j = 2; j <= i - 1; j++) { if (i % j == 0) { c = 0; break; } } if (c == 1) { b++; } } cout << b; return 0; }
解析:
首先,这道题有手就行,欸!我手呢!?
1.写一个 for 循环~用来枚举从 2 到 a 的每一个数!
2.定义判断变量 c ,再写一个循环来枚举 从 2 到 i - 1 的每个数。(因为质数本来就有两个因数,我们要看还有没有其他因数)(我不喜欢 j * j,感觉逻辑容易乱😕 ,你也能写 j * j <= i)
3.写一个判断,看看被测试的数能否被测试的因数整除。能就不是质数,将判断变量改为 0 。然后就可以跳出循环了,继续跑没意义。
4.如果判断变量是 1 ,统计变量就 自增。
5.输出,并点赞👍 (求你了),不然我的手就真没了!!!(QAQ)
-
2
嗨嗨嗨,我双双来编题解了!!! 老话,请勿借(
抄)鉴(袭)#include <iostream> #include <iomanip> #include <cstdio> #include <cmath> using namespace std; int main() { int a,tongji_2=0; cin >> a; for (int i=2;i<=a;i++) { int tongji_1=1; for (int j=2;j<=i-1;j++) if (i%j==0) { tongji_1=0; break; } } if (tongji_1==1) { tongji_2++; } } cout << tongji_2; return 0; }
注意!!!
1.两个变量不要设在一个int里,一个设在循环外,一个设在循环内。否则程序会因为没初始化变量而执行到有两个素数时就不再增加(程序GAME OVER)
2.注意for循环格式,切记要把i和j设为2,而不是1。(程序又GAME OVER)
3.j要小于等于i-1,because一个素数的因数有它本身。(程序双GAME OVER)
4.break可加可不加。
5.你懂的...... 👍 👍 👍 👍 👍 !!!!
作者编代码时的小趣事
我弄出来的结果有:WA(wrong answer) CE (compile error) TLE (time long error) AC (accept correct) 甚至还有一个RTE (runtime error) 到最后我才发现我犯了除以0的错误!!!!!!!!!!
-
1
思路:素数就是除了1和它本身没有其他因数的 数,1除外(参考4年级数学课本).于是我们便可以遍历1-n,看他有没有其他因数. c++代码:
#include<bits/stdc++.h> //from Mr.zhang using namespace std; int main() { int n,f; cin >> n; int cnt = 0; for (int i = 2; i <= n; i++) { f=1; for(int j = 2; j <=sqrt(i); j++) //判断ing { if(i%j==0){ f=0; break; //提前退出 } } if(f){ //cout << i << endl ; cnt++; } } cout << cnt<< endl; //结束qwq return 0; }
python代码,附带写入** ` 写入后文件名为质数.txt
a = int(input()) b = 0 f = open('质数.txt', 'w', encoding='utf-8') zhi = [] f.write('1-'+str(a)+'的质数'+'\n') for i in range(1,a+1): for j in range(i): j += 2 if i % j == 0: if i == j: zhi.append(i) if b == 10: f.write("\n") b = 0 f.write(str(i)+" ") b += 1 else: break f.close() # 当文件结束使用后记住需要关闭文件
谢谢,阅读,祝你编程愉快
-
0
#include<iostream> using namespace std; int main() { int n,num=0; cin >> n; for(int i=2;i<=n;i++) { bool flag=true;//默认这个数是素数 for(int j=2;j<i;j++)//因数筛选 { if (i%j==0)//如果这个数有其他因数 { flag=false;//这个数不是素数 break;//不用继续判断 } } if (flag)//如果判断结果为是 { num++;//个数加一 } } cout << num; return 0; } 看在我那么努力写题解的份上,大家点个赞呗~
-
0
求2~n(n为大于2的正整数)中有多少个素数。
用循环遍历2到n的每一个数,判断并统计即可.
如何判断?根据素数的定义,素数只能被1和它本身整除,故用循环枚举2到该素数-1的每个数,能整除就不是素数,都不能整除就是素数.
代码如下,如果你用循环嵌套来判断素数,当判断出不是素数时可以用
break
跳出循环。👍#include<bits/stdc++.h> using namespace std; int n,ans; bool prime(int x){ for(int i=2;i<x;i++){if(x%i==0){return false;}}//能整除,不是素数,函数结束运行并返回结果 return true;//都不能整除,是素数 } int main(){ cin>>n; for(int i=2;i<=n;i++){if(prime(i)){ans++;}}//判断并统计 cout<<ans; return 0; }
-
0
#include <iostream> using namespace std; bool prime(int i) { if (i < 2) return false; for (int j = 2; j * j <= i; j++) { if (i % j == 0) { return false; } } return true; } int main() { int n,s = 0; cin>>n; for(int i = 2;i<=n;i++){ if(prime(i)){ s++; } } cout<<s<<endl; return 0; }
把代码分成两个部分,主函数部分和函数部分,先完成一个可以判断素数的函数,在计算,就简单了。
-
0
思路:
先枚举2-n的每一个数(设为i),然后再枚举2到i-1中每一个数(其实枚举2到根号i中的数用时更短,但我写的时候忘了),如果这中间有i的因数,就说明i不是素数。此时将默认值为0的变量state设为1,循环结束时,判断state == 0是否成立(我写的时候将表达式写成了!(state),是因为如果state等于0,那么这个表达式返回True,此时ans+1;如果state等于1,返回值为False,ans不改变),成立就将ans+1
#include <iostream> using namespace std; int main() { int n,ans = 0; //ans这个变量用于求有几个素数 cin >> n; for(int i = 2;i <= n;i++) { int state = 0; for(int j = 2;j < i;j++) { if(i % j == 0) { state = 1; break; } } if(!(state)) ans += 1; } cout << ans; return 0; }
-
0
解析
让i从2遍历到,如果i是素数,就计数。
判断素数方式:如果2~sqrt(n)中,没有任何数可以整除n,那么n就是素数。
题解
#include <iostream> using namespace std; int main() { int n; cin >> n; int sum = 0; for (int i = 2; i <= n; i++) { int flag = 1; for (int j = 2; j * j <= i; j++) { if (i % j == 0) { flag = 0; break; } } if (flag) { sum++; } } cout << sum; return 0; }
-
-2
我看见好像没人用质数筛法(埃氏筛)做这道题的??? 时间复杂度比普通的做法要低一点~ 代码奉上———— 先给大家说一下埃氏筛的思路: 首先定义一个布尔数组,然后从2的倍数开始,依次将他们标记为合数,最后剩下的未被标记的就一定是素数了。
#include <bits/stdc++.h> using namespace std; bool a[50005]; int sum; int main() { int n; cin>>n; //埃氏筛主体过程: for(int i=2;i<=n;i++)//遍历2~n之间的所有数; { if(a[i]==false)//判断是否被标记; { for(int j=i+i;j<=n;j+=i)//进行标记; { a[j]+=1; } } } for(int i=2;i<=n;i++)//统计素数个数; { if(a[i]==false) sum++; } cout<<sum;//输出。 return 0; }
不喜勿喷
敬请参照
- 1
信息
- ID
- 282
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- 递交数
- 1894
- 已通过
- 797
- 上传者