PAT 1007. 素數對猜想經典方法,與少見方法之我見

1007. 素數對猜想 (20)

時間限制
400 ms
內存限制
65536 kB
代碼長度限制
8000 B
判題程序
Standard
作者
CHEN, Yue

讓我們定義 dn 爲:dn = pn+1 - pn,其中 pi 是第i個素數。顯然有 d1=1 且對於n>1有 dn 是偶數。“素數對猜想”認爲“存在無窮多對相鄰且差爲2的素數”。

現給定任意正整數N (< 105),請計算不超過N的滿足猜想的素數對的個數。

輸入格式:每個測試輸入包含1個測試用例,給出正整數N。

輸出格式:每個測試用例的輸出佔一行,不超過N的滿足猜想的素數對的個數。

輸入樣例:
20
輸出樣例:

4

方法一:我原來的方法

#include<stdio.h>
#include<math.h>
int pansu(int n);
int main()
{
	int k=0;
	int a[100000];
	int i,n,N=0;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		if(pansu(i)==1)
		{
			a[k]=i;
			k++;
		}
			
	}
	for(i=0;i<k-1;i++)
	{
		if(a[i+1]-a[i]==2)
		N++;
	}
	printf("%d",N);
	
 } 
 int pansu(int n)
 {
 	int i;
 	for(i=2;i<=sqrt(n);i++)
 	{
 		if(n%i==0)
 		{
 			return 0;
 			break;
		 }
	 }
	 if(i>=sqrt(n))
	 {
	 	return 1;
	 }
 }
這個方法一開始在最後一個測試點會過不去,顯示段錯誤,是內存超限的原因,於是我將數組大小從1000擴大到了100000於是就可以滿分了
方法二,網上大神的方法,大概意思是向素數數組中存儲100個素數,然後判斷方法是這個數能否被數組下標小於等於這個數字開根號的數組中的數值整除,如果能就不是素數。下面碼上磚
#include <stdio.h>
int main()
{
    int N;
    scanf("%d", &N);
    /* record three successive numbers if they are prime numbers, start from 2, 3, 4 */
    int iPrimeMinus2 = 1, iPrimeMinus1 = 1, iPrime;
    /* record the prime numbers before sqrt(10^5) */
    int primes[100] = {2, 3};
    int paircount = 0;
    int primecount = 2;
    
    for (int i = 4; i <= N; i++)
    {
        iPrime = 1;
        /* test if i is a prime number */
        for(int j = 0; primes[j] * primes[j] <= i; j++) if(i % primes[j] == 0)
        {
            iPrime = 0;
            break;
        }
        /* i is a prime number */
        if(iPrime == 1)
        {
            if(primecount < 100)    primes[primecount++] = i;
            if(iPrimeMinus2 == 1)   paircount++;    /* a prime pair found */
        }
        /* change the flags */
        iPrimeMinus2 = iPrimeMinus1;
        iPrimeMinus1 = iPrime;
    }
    printf("%d", paircount);
    
    return 0;
}
這兩個方法都可以得到滿分,在10000的測試下得到的結果相同都是1224,但是還是有些不同就是在100,0000數據時,方法一得到的結果是8169,而方法二得到的結果是6195,方法二的結果偏下,但是測試點應該在10,0000以內,至於這兩個程序到底哪個跟準確,還有待考證,希望大神們能多給我一些指點^_^
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章