#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)の上限値はmax 2147483647になります。私は素数を見つけるためにErastostenesのSieveを使用しています。その後、私はprintf
の素数を昇順にしたいと思います。残念ながら、私はランタイムエラーが発生している、私はそれを作成しようとしている非常に大きな配列のためだと仮定します。私は問題の解決策について助言が必要です。 STDINのC - 特定のBIG範囲から素数を取得する
例:STDOUTの
1
1 10
例:
2
3
7
'unsigned long int v [UPPER_LIMIT];はおそらく大きすぎます。 'malloc'で作成してみてください。 –
いつ5が1と10の間の素数ではないのですか? –