C語言程式設計:把一個分數分解成n個埃及分數 的和形式,n最小
1.題目分析:
把真分數表示為埃及分數之和的形式,所謂的埃及分數是指分子為1的分數
例如:7/8=1/2+1/3+1/24;要求用最少的埃及分數來表示
解析:設a、b為互質正整數,a<b 分數a/b 可用以下的步驟分解成若干個單位分數之和:
步驟一: 用b 除以a,得商數q1 及餘數r1。(r1=b - a*q1)
步驟二:把a/b 記作:a/b=1/(q1+1)+(a-r)/b(q1+1)
步驟三:重複步驟2,直到分解完畢
以上其實是 數學家 斐波那契提出的一種求解 埃及分數 的貪心演算法,準確的演算法表述應該是這樣的:
設某個真分數的分子為a,分母為b;
把b除以a的商部分加1後的值作為埃及分數的某一個分母c;
將a乘以c再減去b,作為新的a;
將b乘以c,得到新的b;
如果a大於1且能整除b,則最後一個分母為b/a;演算法結束;
或者,如果a等於1,則,最後一個分母為b;演算法結束;
否則重複上面的步驟
2.C語言程式碼:
#include <stdlib.h> #include <stdio.h> int fun(int A, int B) { int b;//作為某個分數的分母 int a;//B/A的商放a中 int flag=0;//作為第一個分數輸出的標誌 if (A == 1) //當輸入的分數的分子是1時直接輸出 { printf("%d/%d\n", A, B); return 0; } else { while (A!=1) { a = B / A;//商 b = a + 1; if (flag == 0) { printf("1/%d", b);//第一個分數輸出 flag = 1; } else { printf("+1/%d", b);//非第一個分數輸出 } A = A * b - B; B = B * b; if (B%A == 0) { B = B / A; A = 1; } } printf("+%d/%d", A, B); } return 0; } int main() { int A, B; printf("輸入分子:"); scanf_s("%d",&A); printf("輸入分母:"); scanf_s("%d", &B); printf("%d/%d=", A, B); fun(A, B); printf("\n"); system("pause"); return 0; }
3.執行結果:
相關推薦
C語言程式設計:把一個分數分解成n個埃及分數 的和形式,n最小
1.題目分析:把真分數表示為埃及分數之和的形式,所謂的埃及分數是指分子為1的分數例如:7/8=1/2+1/3+1/24;要求用最少的埃及分數來表示解析:設a、b為互質正整數,a<b 分數a/b 可用以下的步驟分解成若干個單位分數之和:步驟一: 用b 除以a,得商數q1
C語言程式設計:求一個迴文數
迴文數,是指正著讀、反著讀,都相同的數字。如:1221、13531...等等。任取一個十進位制整數,用下面的方法可以求出一個迴文數:把這個數字的各個位,顛倒前後位置,形成一個新數,再和原數相加,得到的和,就可能是一個迴文數。如果不是迴文數,就再重複上述的步驟,則最終可得到迴文數。如十進位制數是 78,則形成迴
遞迴演算法(求n的加法組合,將一個整數拆分成多個整數相加的形式, O(N)時間,O(N)空間)
網上的多種解法比較複雜,本文用遞迴方法,22行程式碼搞定。時間和空間複雜度已經降到最低! 第三版:加入創作思路。 這個函式的主要功能就是輸出所有組合。既然是輸出所有的組合,那就意味著內部有一個遍歷所有組合的過程。既然是遍歷,而且是O(N)時間,那就說明這個遍歷是按照某種輸出次序,從“第一個組合”遍歷到
c語言程式設計:用strcpy比較陣列(銀行卡密碼程式設計),strcpy(複製陣列內容)和getchar()(敲鍵盤字元,統計不想要的字元的個數)
統計從鍵盤輸入一行字元的個數: 1 //用了getchar() 語句 2 //這裡的\n表示回車 1 #include <stdio.h> 2 #include <stdlib.h> 3 int main() 4 { 5 int n =
《C語言程式設計:現代方法(第2版)(K.N.King 著)》學習筆記一:C語言概述
1.1 C語言的歷史 1.1.1 起源 C語言是美國貝爾實驗室的 Dennis Ritchie、Ken Thompson 等人為開發 UNIX 作業系統而於 1972 年設計的一種計算機程式語言。
《C語言程式設計:現代方法(第2版)(K.N.King 著)》學習筆記三:C語言基本概念(2)
2.3 註釋 每一個程式都應該包含識別資訊,即程式名、編寫日期、作者、程式的用途以及其他相關資訊。C語言把這類資訊放在註釋(comment)中。 符號 /* 標記註釋的開始,而符號 */ 則標記註釋
《C語言程式設計:現代方法(第2版)(K.N.King 著)》學習筆記四:C語言基本概念(3)
2.5 讀入輸入 為了獲取輸入,就要用到 scanf 函式。它是C函式庫中與 printf 相對應的函式。scanf 中的字母 f 和 printf 中的字母 f 含義相同,都是表示“格式化”的意思
《C語言程式設計:現代方法(第2版)(K.N.King 著)》學習筆記五:C語言基本概念(4)
2.7 識別符號 在編寫程式時,需要對變數、函式、巨集和其他實體進行命名。這些名字稱為識別符號(identifier)。在C語言中,識別符號可以含有字母、數字和下劃線,但是必須以字母或者下劃線開頭。
《C語言程式設計:現代方法(第2版)(K.N.King 著)》學習筆記六:C語言基本概念(5)
問與答 GCC 最初是 GNU C Compiler 的簡稱。現在指 GNU Compiler Collection,這是因為最新版本的 GCC 能夠編譯用 Ada、C、C++、Fortran、Ja
C語言程式設計:圖書管理系統(超詳細有登入系統,附程式碼和試驗報告)
C課程設計——圖書管理系統 1、題目意義 圖書館,作為文獻的聚集地和展示平臺,常常扮演著引領文化前進的角色,是每個大學不可或缺的基礎設施,而圖書管理系統則是一個圖書館能夠正常運轉的關鍵。本次課程設計使用C語言製作程式來實現圖書的登記,刪除,查詢,瀏覽以及讀者的借
《C語言程式設計:現代方法(第2版)(K.N.King 著)》學習筆記九:格式化輸入/輸出(2)
3.2 scanf 函式 就如同 printf 函式用特定的格式顯示輸出一樣,scanf 函式也根據特定的格式讀取輸入。像 printf 函式的格式串一樣,scanf 函式的格式串也可以包含普通字元
用C語言實現:輸入一個字元,則輸出它的大小或小寫字元。
題目: 用C語言實現:連續輸入一個大寫字元則輸出它的小寫字元;輸入它的小寫字元則輸出它的大寫字元;輸入數字則不輸出任何。 思路: 題目說輸入字元或數字,輸入的格式不一樣,所以不可以使用scanf()那麼可以用getchar()連續輸入多個字元. 既然是連續輸入,
想當黑客?淺談C語言程式設計:不會這個知識就別想了!
淺談C語言資料結構——鏈式堆疊 看到標題點進來的朋友,應該對黑客這個名詞很敏感吧?我想應該是這樣的,但是你們知道作為一名黑客需要學習哪些知識嗎?小編不是什麼大佬,但小編可以明確的告訴你,學習C語言是必不可少的一步,為什麼?因為C語言是一個非常“底層”的語言,也是應用最廣泛的
C語言程式設計:用LU分解法求解方程組
示例:用LU分解法求解下列方程組:#include<stdio.h> #define max 4 void main() { int i,j,k,sum,L[max][max]={0},U[max][max]={0}, A[max][max]={4,2,1,
C++:如何把一個int轉成4個位元組?
例如, int n = sizeof( int) ; // n為4 但問題是:如何在程式碼裡轉成4個位元組呢? 方法1:memcpy 這種方法很暴力,也不科學。大家先試一下。 unsigned int a = 0x12345678; un
【C語言程式設計】編寫一個程式解決選擇問題,令k=n/2
初次看到這個題目時有點懵,能力有限,沒法寫出高效版,先碼個高時間複雜度的(O(N^2)): #include<stdio.h> void sort(int a[]); int main() { int a[10]={1,4,2,34,12,5,
C語言程式設計:大小寫互換
從鍵盤輸入一個字串,將其中的大寫字母變小寫,小寫變大寫,其它字元不變。 懸賞分:0 - 離問題結束還有 10 天 7 小時 //-----------------------------------
C語言程式設計:有n個人圍成一圈,順序排號。從第一個人開始報數...
但是,看這些答案的程式,太麻煩的居多。做而論道針對這個問題,寫了一個程式,自我感覺是最簡短的。呵呵,歡迎網友拍磚。程式如下:==============================#include
C語言實現:一個數組中只有兩個數字是出現一次,其他所有數字都出現了兩次。
思路:異或陣列中的每一個數,最終出現的結果是兩個只出現一次數字的異或結果,,因為兩個陣列不一樣,所以異或結果不為0,二進位制結果有一個是1.在結果中找到第一個為1的位置,記為n,然後陣列右移n位,為1,為0,分別輸出兩個數#include <stdio.h> #i
面試總結:任意一個整數分解為幾個連續正整數之和
前陣子參加了國內某一大公司的面試。到了之後,人家不問出身,不問來歷,就直接開機讓我上機程式設計。因為是第一次在面試時上機操作,儘管題目不是很難,但是由於沒搞清楚機考和筆試的區別,導致最後面試失敗。現在總結一下自己在機考時碰到的一些問題,以免自己以後再犯同樣的錯