NowCode猜想

    xiaoxiao2025-04-08  34

    nowcoder在家极度无聊,于是找了张纸开始统计素数的个数。 设函数f(n)返回从1-n之间素数的个数。 nowcoder 发现: f(1) = 0 f(10) = 4 f(100) = 25 … 满足g(m) = 17 * m^2 / 3 - 22 * m / 3 + 5 / 3 其中m为n的位数。 他很激动,是不是自己发现了素数分布的规律了! 请你设计一个程序,求出f(n),来验证nowcoder是不是正确的,也许还可以得诺贝尔奖呢。_ 输入描述: 输入包括多组数据。 每组数据仅有一个整数n (1≤n≤10000000)。 输出描述: 对于每组数据输入,输出一行,为1->n(包括n)之间的素数的个数。 示例1 输入 1 10 65 100 0 输出 0 4 18 25 思路:该题主要用了欧拉筛 // write your code here cpp

    #include <iostream> #include<stdio.h> #include<stdlib.h> #include<math.h> using namespace std; int prime[10000000],pnum=0; bool p[10000000]={false};//记录当前数是否被筛过 int main() { int n; while(cin>>n&&n!=0) { pnum=0; for(int i=2;i<=n;i++) { if(p[i]==false)//如果没有被筛过则为素数 prime[pnum++]=i; for(int j=0;j<pnum;j++) { if(i*prime[j]>n)// 当要标记的合数超出范围时跳出 break; p[i*prime[j]]=true;// 将已经记录的素数的倍数进行标记 if(i%prime[j]==0) //关键步骤 break; } } cout<<pnum<<endl; } return 0; }
    最新回复(0)