2·14 情人&元宵節專題:半質數的個數-c#求解-英雄會在線編程題目

編程挑戰裏面又出新題了,看看題目吧:

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

 

那個求質數的方法,不管用篩選方法,還是其他方法,感覺效率都不高,不知道大家有沒有好的方法。

這道題就寫到這裏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章