該樓層疑似違規已被系統折疊?隱藏此樓查看此樓
#include
#include
int* pt = NULL; // primes_table
int pt_size = 0; // primes_table 數量大小
int init_primes_table(void)
{
FILE* pFile;
pFile = fopen("primes_table.bin", "rb");
if (pFile == NULL) {
fputs("primes_table.bin error", stderr); // 如果文件錯誤,退出1
exit(1);
}
// obtain file size: 獲得文件大小
fseek(pFile, 0, SEEK_END); // 指針移到文件末位
int file_size = ftell(pFile); // 獲得文件長度
rewind(pFile); // 函數rewind()把文件指針移到由stream(流)指定的開始處, 同時清除和流相關的錯誤和EOF標記
int pt_size = file_size / sizeof(int); // 質數個數
pt = new int[pt_size]; // 分配 質數表內存
// copy the file into the buffer: 該文件復制到緩沖區
int result = fread(pt, sizeof(int), pt_size, pFile); // 返回值是讀取的內容數量
if (result != pt_size) {
fputs("Reading error", stderr); // 返回值如果不和文件大小,讀錯誤
exit(3);
}
fclose(pFile);
return pt_size;
}
/* 非遞歸算法 二分法查找
* 算法:當數據量很大適宜采用該方法。
* 采用二分法查找時,數據需是排好序的。
* 主要思想是:(設查找的數組區間為array[low, high])
*/
int binary(int* a, int key, int n)
{
int left = 0, right = n - 1, mid = 0;
mid = (left + right) / 2;
while (left < right && a[mid] != key) {
if (a[mid] < key) {
left = mid + 1;
} else if (a[mid] > key) {
right = mid;
}
mid = (left + right) / 2;
}
if (a[mid] == key)
return mid;
return -1;
}
// 判斷是否質數 9999991 以內
bool isprimes(int x)
{
int flag = binary(pt, x, pt_size);
if (flag == -1)
return false;
return true;
}
int main(int argc, char* argv[])
{
pt_size = init_primes_table();
int end = 10000;
while (!isprimes(end--)) {
}
printf("%d 是 素數\n", ++end);
return 0;
}
使用while 感覺簡單點