加點註釋
程序代码:
#include <cstdio>
#include <cstdlib>
#include <conio.h>
/*
功能: 暫停程序等待用戶鍵盤按鍵
*/
void Pause(void)
{
printf_s("\nPress any key to continue...");
_getch();
}
/*
功能: 判斷指定的整數是否素數
*/
bool IsPrime(unsigned int n)
{
if (n < 2)
{
/* 0、1不是素數 */
return false;
}
if (n % 2 == 0)
{
return n == 2;
}
if (n % 3 == 0)
{
return n == 3;
}
if (n % 5 == 0)
{
return n == 5;
}
for (unsigned int i = 7; i * i <= n; i += 2)
{
if (n % i == 0)
{
return false;
}
}
return true;
}
/*
功能: 建立素數分佈表
*/
bool Create_Prime_File(const char* filename)
{
const unsigned int max = 0xffffff; // 素數表値域,創建的文檔尺寸16M
FILE* file;
if (fopen_s(&file, filename, "wb") != 0)
{
return false;
}
for (unsigned int x = 0; x <= max; ++x)
{
fputc(IsPrime(x), file);
}
fclose(file);
return true;
}
const char* File_Name = "Prime_Number.DAT"; // 素數表文件名
const size_t NUMBER_PER_ROW = 10; // 輸出時每行顯示的數據數目
/*
功能: 程序入口
*/
int main(void)
{
FILE* file;
if (fopen_s(&file, File_Name, "rb") != 0)
{
if (!Create_Prime_File(File_Name))
{
return EXIT_FAILURE;
}
fopen_s(&file, File_Name, "rb");
}
/* 輸出素數 */
unsigned int start = 1000000;
unsigned int end = 1002000;
size_t count = 0;
fseek(file, start, SEEK_SET);
for (unsigned int x = start; x <= end; ++x)
{
if (fgetc(file))
{
printf_s("%6u", x);
putchar((++count % NUMBER_PER_ROW == 0) ? '\n' : ' ');
}
}
fclose(file);
Pause();
return EXIT_SUCCESS;
}
最終的代碼,其實並不需要前面的IsPrime()和Create_Prime_File()函數。那個建立數據表的過程,是用於第一次創建的,該文件創建好後,就可以永久使用了。
[此贴子已经被作者于2016-3-25 10:22编辑过]