利用廣義歐幾里得除法解決法雷數列問題
阿新 • • 發佈:2018-12-22
利用廣義歐幾里得除法解決法雷數列問題
問題如下:
對任意給定的一個自然數n,將分母小於等於n的不可約的真分數按升序排列,並且在第一個分數之前加上0/1,在最後一個分數之後加上1/1,這個序列稱為n級法雷數列,以Fn表示。如F5為:0/1,1/5, 1/4, 1/3, 2/5, 1/2, 3/5, 2/3, 3/4, 4/5,1/1.其元素個數為11.
現在給出n讓你求其n級法雷數列中元素的排列和個數。
解決思路:
利用廣義歐幾里得除法求取分子和分母的最大公因數,輸出最大公因數為1的分式(不可約分),然後將分式轉化為小數比較大小並利用氣泡排序對其從小到大排列,最後以分式形式輸出。
原始碼分享如下:
#include <stdio.h> #include <stdlib.h> #define N 1000 int QuYu(int num1, int num2) { int num3 = 1; //餘數 for(; num3 > 0;) { num3 = num1 % num2; num1 = num2; num2 = num3; } return num1; //返回最大公因數 } int main() { int QuYu(int, int); //定義廣義歐幾里得函式 int num1 = 0; //要進行操作的數字 int tempi; //氣泡排序中間變數 int tempj; double tempnum2; int i = 0; double i1 = 0; //整形型別無法除出小數,在分數轉小數時作為中間變數,和分子i同步 int j = 0; double j1 = 0; //和分母j同步 int k = 0; //結構體陣列Data的下標 int m = 0; //計數器,計算此法雷數列除去 0/1 ,還有多少個元素 struct Data //定義一個結構體陣列,用來儲存分數的值和其對應的分子分母 { double num2; //儲存真分數的值,用來比較大小 int numi; //每個資料對應的i,也就是分子 int numj; //每個資料對應的j,也就是分母 }data[N]; printf("輸入一個要求其法雷數列的整數:"); scanf("%d", &num1); //將符合法雷數列的分數的值,以及其分子分母進行儲存 for(i = 1, i1 = 1; i <= num1; i++, i1++) //i表示分子 { for(j = 1, j1 = 1; j <= num1; j++, j1++) //j表示分母 { if(i == 1) //任何非0數對0取餘都為0,所以講i=1的情況單獨拿出來 { data[k].num2 = (i1 / j1); data[k].numi = i; data[k].numj = j; k++; //結構體陣列的下標 m++; //計數,總共有幾個分數產生,作為後邊迴圈的終止條件 } else { if(i < j && QuYu(j, i) == 1) //要求是真分數,並且最大公因數為1 { data[k].num2 = (i1 / j1); data[k].numi = i; data[k].numj = j; k++; m++; } } } } //對所有符合條件的分數進行大小排序 for(i = 0; i < m - 1; i++) //外層迴圈控制氣泡排序的輪數 { for(j = 0; j < m - i - 1; j++) //內層迴圈控制每輪迴圈的次數 { if(data[j].num2 > data[j + 1].num2) { //利用3箇中間變數,在氣泡排序後,將結構體陣列中的3個值進行轉移 tempnum2 = data[j].num2; data[j].num2 = data[j + 1].num2; data[j + 1].num2 = tempnum2; tempi = data[j].numi; data[j].numi = data[j + 1].numi; data[j + 1].numi = tempi; tempj = data[j].numj; data[j].numj = data[j + 1].numj; data[j + 1].numj = tempj; } } } //輸出結果,在第一個之前輸出0/1 printf("\n%d的法雷數列共有%d個元素,如下:\n\n", num1, m + 1); printf("0/1 "); for(i = 0; i < m; i++) { printf("%d/%d ",data[i].numi, data[i].numj); } return 0; }
執行結果:
以上就是關於解決法雷數列問題的一種思路,望大佬多多指教,小白從中受益!