#include <stdio.h>
#include <math.h>
#define UPPER_LIMIT 2147483647
void sieve(unsigned long int n, unsigned long int primes[]);
main()
{
unsigned long int low, up, steps;
unsigned long int v[UPPER_LIMIT];
sieve(UPPER_LIMIT, v);
scanf("%ld\n",&steps);
for (unsigned long int i=0;i<steps;i++){
scanf("%ld %ld\n",&low,&up);
for(unsigned long int j=low; j<up; j++){
if (v[j] == 1){
printf("%ld\n",j);
}
}
}
}
void sieve(unsigned long int n, unsigned long int primes[])
{
for (unsigned long int i=0;i<n;i++){
primes[i]=1;
}
primes[0]=0,primes[1]=0;
for (unsigned long int i=2;i<sqrt(n);i++) {
for (unsigned long int j=i*i;j<n;j+=i){
primes[j] = 0;
}
}
}
我試圖解決從特定範圍打印素數的問題。 起初scanf
我們得到要審查的案件數量。範圍由stdin的下一行給出,例如(1 10)上限值可以在最大值2147483647處。我使用Erastostenes的Sieve來查找素數。之後,我想printf
素數按升序排列。不幸的是,我得到一個運行時錯誤,我認爲這是因爲我想創建的非常大的數組。我需要關於該問題的可能解決方案的建議。標準輸入的C - 從特定的大範圍獲取素數
實施例:
1
1 10
標準輸出的實施例:
2
3
7
'unsigned long int v [UPPER_LIMIT];'可能太大了。嘗試用'malloc'創建。 –
從什麼時候5不是1到10之間的素數? –