法雷序列節點的定義
struct FareyListNode {
int numerator; // 分子
int denominator; // 分母
FareyListNode *next;
FareyListNode(int numerator, int denominator) {
this->numerator = numerator;
this->denominator = denominator;
this->next = nullptr;
}
};
法雷序列實現的函數
方法:不斷往後插入直至不能插入後頭指針後移
/*生成法雷序列,從inFile讀取n,輸出到outFile*/
void fareySubsequence(const char* inFileName, const char* outFileName) {
std::ifstream fin(inFileName);
int n;
if (fin.is_open()) {
fin >> n;
fin.close();
}
std::ofstream fout(outFileName);
if (fout.is_open()) {
FareyListNode * farey = new FareyListNode(0, 1);
// 初始化分子分母[0,1]/[1,1]
farey->next = new FareyListNode(1, 1);
FareyListNode * tempFarey = nullptr;
// 生成法雷序列
long count = -1;
while (farey->next != nullptr) {
while (farey->denominator + farey->next->denominator <= n) {
tempFarey = new FareyListNode(farey->numerator + farey->next->numerator,
farey->denominator + farey->next->denominator);
tempFarey->next = farey->next;
farey->next = tempFarey;
tempFarey = nullptr;
}
count++;
fout << farey->numerator << '/' << farey->denominator << '\t';
tempFarey = farey;
farey = farey->next;
delete tempFarey;
tempFarey = nullptr;
}
fout << farey->numerator << '/' << farey->denominator << '\t';
tempFarey = farey;
farey = farey->next;
delete tempFarey;
tempFarey = nullptr;
delete farey;
farey = nullptr;
fout << "總數 = " << count;
fout.close();
}
}
法雷節點調用的主函數(通過文件讀取)
const char* InFileNameFareySubsequence = "farey.txt";
const char* OutFileNameFareySubsequence = "fareyTest.txt";
int main() {
clock_t startTime, endTime;
startTime = clock();//計時開始
fareySubsequence(InFileNameFareySubsequence, OutFileNameFareySubsequence);
endTime = clock();//計時結束
printf_s("The run time is: %f s", (double)(endTime - startTime) / CLOCKS_PER_SEC);
system("pause");
return 0;
}