题目描述
从键盘输入一个整数n(98000<=n<=100000),统计1至n范围内素数的个数。
质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。换句话说,只有两个正因数(1和自己)的自然数即为素数。比1大但不是素数的数称为合数。1和0既非素数也非合数。
输入
输入一个整数n(98000<=n<=100000)
输出素数的个数样例输入 Copy
100000
样例输出 Copy
9592
#include <stdio.h>
#include <stdlib.h>
/*
求素数:只能被1和他本身整除的数(1除外)
98000<=n<=100000
*/
int main(int argc, char *argv[]) {
int i,j;
int flag;//标识某个数是不是素数
int cnt = 0;//统计素数的个数
//i代表2到100之间的数
for(i=98000;i<=100000;i++){
//内循环判断i是不是素数
flag = 0;//默认i是素数
for(j=2;j<10;j++){
if((i!=j) && (i % j == 0)){
flag = 1;//表示i不是素数
break;
}
}
if(flag==0){ //flag=0表示i是素数
//每行显示10个素数
if((cnt!=0) && (cnt % 10 ==0)){
printf("\n");
}
cnt++;
printf("%d\t",i);
}
}
return 0;
}
这是比较基础的东西,建议课下多多学习,下面是我的代码,但你要尽量把他变成自己的东西,下次遇到能写出来
参考代码如下:
#include <cstdio>
#include <cstring>
#include <set>
#include <algorithm>
#include <cmath>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
const int maxn=1<<30;
const int SIZE=1e5+10;
const double pi=acos(-1);
using namespace std;
int prim[SIZE];
void get_prim(){
memset(prim,0,sizeof(prim));
for(LL i=2;i<SIZE;i++){
if(!prim[i]){
prim[++prim[0]]=i;
for(LL j=i*i;j<SIZE;j+=i)
prim[j]=1;
}
}
}
int main()
{
get_prim();
int n;
scanf("%d",&n);
int pos=lower_bound(prim+1,prim+prim[0],n)-prim;
if(prim[pos]==n)printf("%d\n",pos);
else printf("%d\n",pos-1);
return 0;
}
void main()
{
int i,j,count=0,n;
while(1)
{
printf("请输入一个整数(98000-100000):");
scanf("%d",&n);
if(n>=98000 && n<100000)
break;
printf("整数范围无效\n");
}
for(int i=2;i<=n;i++)
{
bool bPrime = true;
for(j=2;j<=i/2;j++)
{
if(i%j==0)
{
bPrime = false;
break;
}
}
if(bPrime)
count++;
}
printf("%d",count);
}
写个时间复杂度少的算法
#include <stdio.h>
int main() {
int n,i,j,s=0;
scanf("%d", &n);
int a[n];
for (i = 2; i <= n; i++) {
for (j = 0; j < s; j++)
if (i%a[j]==0)
break;
if (j==s)
{
a[s++] = i;
}
}
printf("%d", s);
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632