埃及分數分解
設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,直到分解完畢
3/7=1/3+2/21=1/3+1/11+1/231
13/23=1/2+3/46=1/2+1/16+1/368
以上其實是斐波那契提出的一種求解埃及分數的貪心演算法,準確的演算法表述應該是這樣的:
設某個真分數的分子為a,分母為b;
把b除以a的商部分加1後的值作為埃及分數的某一個分母c;
將a乘以c再減去b,作為新的a;
將b乘以c,得到新的b;
如果a大於1且能整除b,則最後一個分母為b/a;演算法結束;
或者,如果a等於1,則,最後一個分母為b;演算法結束;
否則重複上面的步驟。
備註:事實上,後面判斷a是否大於1和a是否等於1的兩個判斷可以合在一起,及判斷b%a是否等於0,最後一個分母為b/a,顯然是正確的。
相關推薦
埃及分數分解
設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,直到分
埃及分數 把一個分數分解成n個 m分之一的形式
【貪心演算法】 設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) 步驟三:重複步
埃及分數 把一個分數分解成n個 m分之一的方式
埃及分數 把一個分數分解成n個 m分之一的形式 【貪心演算法】 設a、b為互質正整數,a<b 分數a/b 可用以下的步驟分解成若干個單位分數之和: 步驟一: 用b 除以a,得商數q1 及餘數r1。(r1=b - a*q1) 步驟二:把a/b 記作:a/b=1/(
埃及分數 把一個分數分解成n個 m分之一的形式
【貪心演算法】 設a、b為互質正整數,a #include <stdio.h> int main(void) { int a,b,c; while(scanf("%d/%d",&a,&b)!=E
C語言將真分數分解為埃及分數程式碼解析
問題描述 現輸入一個真分數,請將該分數分解為埃及分數。 問題分析 真分數:分子比分母小的分數,叫做真分數。真分數的分數值小於1。如1/2,3/5,8/9等。分子是1的分數,叫單位分數。古代埃及人在進行分數運算時,只使用分子是1的分數。因此這種分數也叫做埃及分數,或者叫單分子分數。如:8/11=1/2+1
C語言程式設計:把一個分數分解成n個埃及分數 的和形式,n最小
1.題目分析:把真分數表示為埃及分數之和的形式,所謂的埃及分數是指分子為1的分數例如:7/8=1/2+1/3+1/24;要求用最少的埃及分數來表示解析:設a、b為互質正整數,a<b 分數a/b 可用以下的步驟分解成若干個單位分數之和:步驟一: 用b 除以a,得商數q1
將真分數分解為埃及分數
題目描述 分子為1的分數稱為埃及分數。現輸入一個真分數(分子比分母小的分數,叫做真分數),請將該分數分解為埃及分數。如:8/11 = 1/2+1/5+1/55+1/110。 輸入描述: 輸入一個真分數,String型 輸出描述: 輸出分解後的string 輸入:
叠代加深,埃及分數
col eas 開始 str pen lap i++ mem none 問題描述: 給出一個分數,由分子a 和分母b 構成,現在要你分解成一系列互不相同的單位分數(形如:1/a,即分子為1),要求:分解成的單位分數數量越少越好,如果數量一樣,最小的那個單位分數越大越
Vijos 1308 埃及分數(叠代加深搜索)
better 方案 emc 分數 fine pri 深搜 can long long 題意: 輸入a、b, 求a/b 可以由多少個埃及分數組成。 埃及分數是形如1/a , a是自然數的分數。 如2/3 = 1/2 + 1/6, 但埃及分數中不允許有相同的 ,如不可以2/3
埃及分數
\n rac symbol string num clas 步驟 可用 一個 真分數分解為埃及分數的思路可歸納如下:(1) 分數的分子用a表示、分母用b表示,變量c用來存儲各個埃及分數的分母。(2) 如果分母是分子的倍數,直接約簡成埃及分數。此時,埃及分數的分母c=b/a;
埃及分數(叠代深搜)
urn 理解 決定 步驟 its void oid %d class #include<bits/stdc++.h> using namespace std; long long ch,mo; int dep; long long ans[1000],s[10
UVA12558 Egyptian Fractions (HARD version) (埃及分數)
include 範圍 sin ring ble gyp lld ret ++i UVA12558 Egyptian Fractions (HARD version) 題解 叠代加深搜索,適用於無上界的搜索。每次在一個限定範圍中搜索,如果無解再進一步擴大查找範圍。 本題中沒有
UVA12558 Egyptian Fractions (HARD version)(埃及分數)
names clear for 下界 rac algorithm bool .com scan 傳送門 題目大意 給出一個真分數 a/b,要求出幾個互不相同的埃及分數(從大到小),使得它們之和為 a/b (埃及分數意思是分子為1的分數,詳見百度百科) 如果有多組解,
埃及分數&&The Rotation Game&&騎士精神——IDA*
better div name fir i++ 問題 叠代加深搜索 lap != IDA*:非常好用的搜索,可以解決很多深度淺,但是規模大的搜索問題。 估價函數設計思路:觀察一步最多能向答案靠近多少。 埃及分數 題目大意: 給出一個分數,由分子a 和分母b 構成,現在要
[題解]「一本通 1.3 練習 1」埃及分數
埃及分數題目連結 這道題比較經典。 演算法:迭代加深+IDA* 優化: 1.迭代加深 2.確定從小到大的搜尋順序 3.確定搜尋上下界 (1)以i為分母的數字不能大於a/b. (2)如果後面的數字都以i為分母仍然<=a/b,退出。 細節: (1)在通分過程中會爆int。 程式碼:
貪心法---埃及分數
這是在演算法導論第二版上面學習到第七章時的一個例子,然後自己寫不出這道題的演算法,想了好久才能想明白,所以做個筆記。 演算法描述:C++ #include "stdafx.h" #include "iostream.h" int commfactor(int m
[Codevs 1228]埃及分數
Egyptian Fraction 第一道迭代加深搜尋,《演算法競賽入門經典》上的例題。 注意分母這個數字可能很大,所以要用long long 在尋找滿足 \(1/c \leq a/b\) 的最小的 \(c\) 時,可以知道\(c=\lceil a/b \rceil\),注意要將\(a/b\)轉換成doub
埃及分數問題——迭代加深搜尋
問題描述:在古埃及,人們使用單位分數的和(即1/a,a是自然數)表示一切有理數。例如,2/3=1/2+1/6,但不允許2/3=1/3+1/3,因為加數中不允許有相同的,則最小的分數越大越好。例如19/45=1/5+1/6+1/18是最優方案。 分析:題目看似不難,但是有陷阱,沒有給出深度,一味回
codevs1288 埃及分數
題目描述: 在古埃及,人們使用單位分數的和(形如1/a的, a是自然數)表示一切有理數。 如:2/3=1/2+1/6,但不允許2/3=1/3+1/3,因為加數中有相同的。 對於一個分數a/b,表示方法有很多種,但是哪種最好呢? 首先,加數少的比加數多的好,其次,加數個數相同的,最小的分數越大越
codevs 1288 埃及分數 (迭代加深搜尋)
題目大意:給你一個分數$a/b$,把它拆解成$\sum_{i=1}^{n}1/ai$的形式,必須保證$ai$互不相同的情況下,儘量保證n最小,其次保證分母最大的分數的分母最小 什麼鬼玄學題!!! 因為要保證$n$最小,所以從小到大遍歷最大層數$n$,令$a'/b'$表示當前剩餘的需要被拆解的數 如果當前