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

来源:互联网 发布:suse linux dns配置 编辑:程序博客网 时间:2024/05/29 08:35

编程挑战里面又出新题了,看看题目吧:

2·14 情人&元宵节专题:半质数的个数
  • 发布公司:
  • 有 效 期:
  • 赛    区:
  • CSDN                
  • 2014-02-142014-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>();

 

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

这道题就写到这里。

1 0
原创粉丝点击