1. 程式人生 > >C語言程式設計:把一個分數分解成n個埃及分數 的和形式,n最小

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

面試總結任意一個整數分解為幾連續正整數之和

       前陣子參加了國內某一大公司的面試。到了之後,人家不問出身,不問來歷,就直接開機讓我上機程式設計。因為是第一次在面試時上機操作,儘管題目不是很難,但是由於沒搞清楚機考和筆試的區別,導致最後面試失敗。現在總結一下自己在機考時碰到的一些問題,以免自己以後再犯同樣的錯