2·14 情人&元宵节专题:半质数的个数-c#求解-英雄会在线编程题目
来源:互联网 发布:suse linux dns配置 编辑:程序博客网 时间:2024/05/29 08:35
编程挑战里面又出新题了,看看题目吧:
- 发布公司:
- 有 效 期:
- 赛 区:
- CSDN
- 2014-02-14至2014-03-16
- 北京
- 难 度 等 级:
- 答 题 时 长:
- 编程语言要求:
- 120分钟
- C C++ Java C#
质数是大家熟知的概念,我们定义一个半质数的概念:如果一个数恰好是两个质数的乘积(可以相同),则称它为半质数。前几个半质数是 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,所以,求出[2,y/2]区间的所有质数
2、从这个质数数组中依次取质数,直到<=(int)Math.Sqrt(y)的这个质数,每个质数对应的都有一个区间,注意这个区间的最小值要大于等于所取的质数,防止重复计算
这个题没什么难度,计算代码如下:
public static int cal(int x, int y)
{
if (y < 4)
return 0;
int count = 0;
int start = 0;
int end = 0;
int mid = array[(int)Math.Sqrt(y)];
for (int i = 0; i <= mid; i++)
{
start = (x-1) / prime[i];
start = array[start] + 1;
if (start < i)
{
start = i;
}
end = y / prime[i];
end = array[end];
if (end >= start)
{
count += end - start+1;
}
}
return count;
}
其中prime为质数数组,array为[0,y/2+1]的数组,用于标记小于等于这个数的最大质数所在prime数组中的索引。这样做主要是方便检索,否则检索也是一项浪费时间的过程。
这里还要注意下:csdn会提交多组数据进行测试,所以,prime和array都是只计算一次,因此要在方法外定义成static。
求质数的方法:
static bool isPrime(int n, List<int> list)
{
bool flag = true;
if (n < 2)
return false;
for (int i = 0; i < list.Count; i++)
{
if (n % list[i] == 0)
{
flag = false;
break;
}
if (list[i] * list[i] > n)
{
break;
}
}
return flag;
}
main方法中的调用如下:
if (first)
{
first = false;
array[0] = -1;
array[1] = -1;
for (int i = 2; i <= 1000000; i++)
{
if (isPrime(i, prime))
{
prime.Add(i);
array[i] = prime.Count - 1;
}
else
{
array[i] = prime.Count - 1;
}
}
}
这几个变量放在方法为定义:
static bool first = true;
static int[] array = new int[1000001];
static List<int> prime = new List<int>();
那个求质数的方法,不管用筛选方法,还是其他方法,感觉效率都不高,不知道大家有没有好的方法。
这道题就写到这里。
- 2·14 情人&元宵节专题:半质数的个数-c#求解-英雄会在线编程题目
- 英雄会(csdn pongo)题解之半质数的个数--2·14情人&元宵节专题
- 2·14 情人&元宵节专题:半质数的个数
- 编程挑战赛:2·14 情人&元宵节专题:半质数的个数
- 朋友的礼物-c#求解-英雄会在线编程题目
- 平衡二叉树--c#求解--英雄会在线编程题目
- 建立信号基站-c#求解-英雄会在线编程题目
- 罐子和硬币-c#求解-英雄会在线编程题目
- 排列搜索-c#求解-英雄会在线编程题目
- 二叉树-c#求解-英雄会在线编程题目
- P次方数-c#求解-英雄会在线编程题目
- P次方数-c#求解-英雄会在线编程题目
- 无穷字符串-c#求解-英雄会在线编程题目
- 数列问题-c#求解-英雄会在线编程题目
- 最小操作数-c#求解-英雄会在线编程题目
- 24点游戏-c#求解-英雄会在线编程题目
- xor值最大-c#求解-英雄会在线编程题目
- 彩色石子-c#求解-英雄会在线编程题目
- 基本语法的介绍不错的网站
- 友元函数和友元类
- appStore上传苹果应用程序软件发布流程
- sort函数中三个参数的用法
- machine learning(5) --AdaBoost分类器
- 2·14 情人&元宵节专题:半质数的个数-c#求解-英雄会在线编程题目
- 调用模板类出现 undefined reference 错误的解决方法
- 内核线程的实例与摧毁
- linux中怎样从底部向上查看log文件
- ZOJ 1204 Additive equations
- TOJ 2429 Find the Clones
- Remove Nth Node From End of List
- Server2008R2:由于没有远程桌面授权服务器可以提供许可证,远程会话被中断..错误的解决方法
- SQL语句优化--1