半质数的个数 csdn 英雄会 高校俱乐部
2014-03-01 11:00
591 查看
2·14 情人&元宵节专题:半质数的个数。
题目:质数是大家熟知的概念,我们定义一个半质数的概念:如果一个数恰好是两个质数的乘积(可以相同),则称它为半质数。前几个半质数是 4, 6, 9, 10, 14, 15, 21, 22, 25,
26。我们的问题是,输入两个正整数x<=y,问[x,y]之间有多少个半质数? 输入:x,y 输出:[x,y]之间有多少个半质数。 输入数据范围 1<=x<=y<=2000000。 祝所有挑战的Heros 2014年情人节、元宵节快乐。
解释:这是一道简单的题目,思路就是打表吧。没多困难。(我怎么发现我写的问题都几乎是当成水题来做的?)
众所周知,求逆的问题相对来说都是比较困难,比如分解问题,矩阵求逆等等。既然范围已出且在可接受范围,那 么还多虑什么?
步骤: 1.打素数表
2.打半质数表
……
代码:
/*******************************************************************************/
/* OS : 3.2.0-58-generic #88-Ubuntu SMP Tue Dec 3 UTC 2013 GNU/Linux
* Compiler : g++ (GCC) 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
* Encoding : UTF8
* Date :
* All Rights Reserved by yaolong.
*****************************************************************************/
/* Description: ***************************************************************
*****************************************************************************/
/* Analysis: ******************************************************************
*****************************************************************************/
/*****************************************************************************/
//*
#include <stdio.h>
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
#define N 2000000
bool prime
;
bool dp[3*N];
int first=1;
void fun1()
{
memset(prime,1,sizeof(prime));
memset(dp,0,sizeof(dp));
int i;
//从2开始筛选
for(i=2; i*i<N; i++)
if(prime[i])
/*确定没被筛选过的,道理很简单:若x|y,y|z,则有x|z.(y被x筛选过,那么y能筛选的数都被x筛选了)可一定程度上避免多余的筛选*/
for(int j=2*i; j<N; j+=i)
prime[j]=false;
}
void fun2()
{
int i,j;
for(i=2; i<N; i++)
{
int tmp=(2*N)/i;
for(j=i; j<=N; j++)
{
if(j>tmp)
break;
if(prime[i]&&prime[j])
{
dp[i*j]=true;
}
}
}
}
int fun3(int x,int y)
{
int res=0;
for(int i=x; i<=y; i++)
{
//cout<<dp[i];
if(dp[i])
{
res++;
}
}
return res;
}
class Test
{
public:
static int howmany (int x,int y)
{
if(first==1)
{
first=0;
fun1();
fun2();
}
return fun3(x,y);
}
};
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{
cout<<Test::howmany(60,1000000)<<endl;
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。
题目:质数是大家熟知的概念,我们定义一个半质数的概念:如果一个数恰好是两个质数的乘积(可以相同),则称它为半质数。前几个半质数是 4, 6, 9, 10, 14, 15, 21, 22, 25,
26。我们的问题是,输入两个正整数x<=y,问[x,y]之间有多少个半质数? 输入:x,y 输出:[x,y]之间有多少个半质数。 输入数据范围 1<=x<=y<=2000000。 祝所有挑战的Heros 2014年情人节、元宵节快乐。
解释:这是一道简单的题目,思路就是打表吧。没多困难。(我怎么发现我写的问题都几乎是当成水题来做的?)
众所周知,求逆的问题相对来说都是比较困难,比如分解问题,矩阵求逆等等。既然范围已出且在可接受范围,那 么还多虑什么?
步骤: 1.打素数表
2.打半质数表
……
代码:
/*******************************************************************************/
/* OS : 3.2.0-58-generic #88-Ubuntu SMP Tue Dec 3 UTC 2013 GNU/Linux
* Compiler : g++ (GCC) 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
* Encoding : UTF8
* Date :
* All Rights Reserved by yaolong.
*****************************************************************************/
/* Description: ***************************************************************
*****************************************************************************/
/* Analysis: ******************************************************************
*****************************************************************************/
/*****************************************************************************/
//*
#include <stdio.h>
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
#define N 2000000
bool prime
;
bool dp[3*N];
int first=1;
void fun1()
{
memset(prime,1,sizeof(prime));
memset(dp,0,sizeof(dp));
int i;
//从2开始筛选
for(i=2; i*i<N; i++)
if(prime[i])
/*确定没被筛选过的,道理很简单:若x|y,y|z,则有x|z.(y被x筛选过,那么y能筛选的数都被x筛选了)可一定程度上避免多余的筛选*/
for(int j=2*i; j<N; j+=i)
prime[j]=false;
}
void fun2()
{
int i,j;
for(i=2; i<N; i++)
{
int tmp=(2*N)/i;
for(j=i; j<=N; j++)
{
if(j>tmp)
break;
if(prime[i]&&prime[j])
{
dp[i*j]=true;
}
}
}
}
int fun3(int x,int y)
{
int res=0;
for(int i=x; i<=y; i++)
{
//cout<<dp[i];
if(dp[i])
{
res++;
}
}
return res;
}
class Test
{
public:
static int howmany (int x,int y)
{
if(first==1)
{
first=0;
fun1();
fun2();
}
return fun3(x,y);
}
};
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{
cout<<Test::howmany(60,1000000)<<endl;
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。
相关文章推荐
- 一道高校俱乐部的题,当时没有写好,从新写了下
- 编程挑战赛:2·14 情人&元宵节专题:半质数的个数
- 2013年底csdn英雄会线下编程决赛纪实
- 杨氏矩阵查找
- 英雄会 高校俱乐部 题解(均分01)
- P次方数 英雄会 csdn 高校俱乐部
- 微软必应·英雄会第三届在线编程大赛:几个bing?
- 庞果答题:亿阳信通:不可表示的数 的一个人见解(8-13第二次更新。)
- 英雄会第一届在线编程大赛:单词博弈 (C++代码) ---miss若尘
- 英雄会第一届在线编程大赛:单词博弈 (解题思路) ---miss若尘
- 英雄会解读:不一样的回答,一样的CTO
- 年年英雄会,岁岁侠客行
- [CTO札记]上海技术英雄会摘要
- 英雄会第四届在线编程大赛·线上初赛:带通配符的数
- 寻找直方图中面积最大的矩形
- CSDN网站系统升级公告
- CSDN系统升级公告
- 2015级成员博客地址
- Servlet工作原理
- 采闲云一朵,入墨修心!