下面的代碼不會嘗試最小化ARR []陣列的尺寸,並且如果該範圍的上端是小於16K然後可以宣佈該ARR []作爲short
而非unsigned int
輸入低端的最低有效值爲2,但代碼沒有檢查該低端限制,您可能需要添加該檢查。
代碼不會盡量減少通過檢查上限的平方根來執行的循環次數,您可能需要添加該檢查。
代碼乾淨地編譯,處理上限爲素數時,下限爲素數時以及極限值不是素數時的情況。
#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
int numTestCases, testCase;
size_t i; // index
size_t lowLimit;
size_t upperLimit;
size_t k; // offset multiplier
scanf("%d", &numTestCases);
/*Looping for t test cases*/
for(testCase=0; testCase<numTestCases; testCase++)
{
scanf("%lu %lu", (unsigned long*)&lowLimit, (unsigned long*)&upperLimit);
unsigned arr[upperLimit+1];
/*Assigning whole array to indicate entry is a prime*/
memset(arr, 0x01, upperLimit+1);
/*Sieve of Eratosthenes logic for assigning false to composite values*/
//size_t sqrtUpperLimit = (size_t)ceil(sqrt(upperLimit));
for(i=2; i<= upperLimit; i++)
{
if(arr[i])
{
if(i >= lowLimit)
{
printf("%ld\n", i);
}
for(k=2; (i*k) <= upperLimit; k++)
{
arr[(i*k)] = 0;
}
}
}
}
return 0;
} // end function; main
這裏是代碼的編輯版本,與提示經由呼叫的用戶的方式加入一些儀表printf()
#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
int numTestCases, testCase;
size_t i; // index
size_t lowLimit;
size_t upperLimit;
size_t k; // offset multiplier
printf("enter number of test cases\n");
scanf("%d", &numTestCases);
/*Looping for t test cases*/
for(testCase=0; testCase<numTestCases; testCase++)
{
printf("enter lower limit upper limit limits\n");
scanf("%lu %lu", (unsigned long*)&lowLimit, (unsigned long*)&upperLimit);
unsigned arr[upperLimit+1];
/*Assigning whole array to indicate entry is a prime*/
memset(arr, 0x01, upperLimit+1);
/*Sieve of Eratosthenes logic for assigning false to composite values*/
//size_t sqrtUpperLimit = (size_t)ceil(sqrt(upperLimit));
for(i=2; i<= upperLimit; i++)
{
if(arr[i])
{
if(i >= lowLimit)
{
printf("%ld\n", i);
}
for(k=2; (i*k) <= upperLimit; k++)
{
arr[(i*k)] = 0;
}
}
}
}
return 0;
} // end function; main
使用上述儀器代碼和的輸入:
5 2 3 30 31 20 27 2 3 4 5
它工作完美。
這是輸出:
enter number of test cases
5
enter upper/lower limits
2 3
sizeof arr[]: 4
2
3
enter upper/lower limits
30 31
sizeof arr[]: 32
31
enter upper/lower limits
20 27
sizeof arr[]: 28
23
enter upper/lower limits
2 3
sizeof arr[]: 4
2
3
enter upper/lower limits
4 5
sizeof arr[]: 6
5
什麼樣的價值觀,你的投入,得到運行時錯誤? – fghj
@ user1034749輸入不是由我給出的。這是來自spoj的問題,答案沒有被網上法官接受。 – Prashanth
如果你輸入'1'作爲第一個數字,那你爲什麼需要'2 100'?程序只處理'2 10'。 – fghj