您的位置:首页 > 编程语言 > C#

2·14 情人&元宵节专题:半质数的个数-c#求解-英雄会在线编程题目

2014-02-20 20:40 337 查看
编程挑战里面又出新题了,看看题目吧:

2·14 情人&元宵节专题:半质数的个数

发布公司:
有 效 期:
赛 区:

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>();

那个求质数的方法,不管用筛选方法,还是其他方法,感觉效率都不高,不知道大家有没有好的方法。

这道题就写到这里。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: