zoukankan      html  css  js  c++  java
  • CodeForces

    A number is called almost prime if it has exactly two distinct prime divisors. For example, numbers 6, 18, 24 are almost prime, while 4, 8, 9, 42 are not. Find the amount of almost prime numbers which are between 1 and n, inclusive.

    Input

    Input contains one integer number n (1 ≤ n ≤ 3000).

    Output

    Output the amount of almost prime numbers between 1 and n, inclusive.

    Examples Input

    10

    Output

    2

    Input

    21

    Output

    8

    如果数字恰好具有两个不同的素数除数,则称为几乎素数。 例如,数字6、18、24几乎是质数,而数字4、8、9、42不是。 找出介于1和n之间(含1和n)的几乎质数的数量。

    输入值
    输入包含一个整数n(1≤n≤3000)。

    输出量
    输出1到n之间(含1和n)的几乎质数的数量。

    例子
    输入
    10
    输出
    2
    输入
    21
    输出
    8

    这道是CF上的题目,我选择了用打表+set做的,题意是输出1-n中几乎质数的数量,几乎质数就是有两个不同质数的除数,即有两个不同的质因子,这里开一个前缀和数组sum,下标存放的是1-i的几乎质数的个数,因为集合的去重性,用集合才存储不同的质因子,一旦szie等于2则说明该数是几乎质数,数据最大到3000,最后打表直接输出sum[n]的值即可。AC代码

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <stack>
    #include <queue>
    #include <set>
    #include <cstring>
    using namespace std;
    const int _max=3e3+50;
    int sum[_max]={0};//前缀和数组
    int main()
    {
    	bool check(int);
    	for(int i=1;i<=3000;i++)
    	{
    		if(check(i))//判断一下这个数是不是几乎质数
    		  sum[i]=sum[i-1]+1;
    		else
    		  sum[i]=sum[i-1];  
    	}
    	int n;
    	cin>>n;
    	cout<<sum[n]<<endl;
    	return 0;
    }
    bool check(int s)
    {
    	set<int >beg;
    	for(int i=2;i*i<=s;i++)//分解质因子的过程
    	  while(s%i==0)
    	  {
    	  	beg.insert(i);
    	  	s/=i;
    	  }
    	if(s!=1)
    	  beg.insert(s);
    	if(beg.size()==2)//等于2则返回true
    	  return true;
    	return false;    
    }
    
  • 相关阅读:
    12月12日学习日志
    12月11日学习日志
    12月10日学习日志
    linux下安装git
    ubuntu上安装mysql
    扩展虚拟机容量
    【linux】你需要以 root 身份执行此命令
    Ubuntu新建Django工程错误:ModuleNotFoundError: No module named 'distutils.core'
    LeetCode26. 删除排序数组中的重复项
    LeetCode27. 移除元素
  • 原文地址:https://www.cnblogs.com/Hayasaka/p/14294324.html
Copyright © 2011-2022 走看看