埃及分數 把一個分數分解成n個 m分之一的形式
阿新 • • 發佈:2019-01-06
【貪心演算法】
設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,顯然是正確的。
實現程式碼 下面的2個程式碼是網上百度的
或者下面的
這道 題 用上面的程式碼解決不了 求大神指教啊 現在已經解決 不知道什麼原因 可能是上面的程式碼的問題 我也不敢保證百度人家的那些是錯誤 的 就保留著吧 可能是題目不同吧 下面貼上題目 以及正確程式碼
下面的這個也是正確
#include <stdio.h> int main(void) { int a,b,c; while(scanf("%d/%d",&a,&b)!=EOF) { // printf("%d/%d=",a,b); while(a!=1) { c = b/a+1; a = a*c-b; b = b*c; printf("1/%d + ",c); //if(a>1) //printf(""); if( (b % a == 0) || (a==1) ) { printf("1/%d",b/a); a = 1; } } printf("\n"); } return 0; }
或者下面的
#include<stdio.h> int main() { long long a,b,c; while(scanf("%lld/%lld",&a,&b)!=EOF) { // printf("Please enter a optional fraction(a/b):"); //; /*輸入分子a和分母b*/ // printf("It can be decomposed to:"); while(1) { if(b%a) /*若分子不能整除分母*/ c=b/a+1; /*則分解出一個分母為b/a+1的埃及分數*/ else{ c=b/a; a=1;} /*否則,輸出化簡後的真分數(埃及分數)*/ if(a==1) { printf("1/%lld\n",c); break; /*a為1標誌結束*/ } else printf("1/%lld + ",c); a=a*c-b; /*求出餘數的分子*/ b=b*c; /*求出餘數的分母*/ if(a==3) /*若餘數為3,輸出最後兩個埃及分數*/ { printf("1/%lld + 1/%lld\n",b/2,b); break;} } } return 0; }
這道 題 用上面的程式碼解決不了 求大神指教啊 現在已經解決 不知道什麼原因 可能是上面的程式碼的問題 我也不敢保證百度人家的那些是錯誤 的 就保留著吧 可能是題目不同吧 下面貼上題目 以及正確程式碼
分數分解
Time Limit: 1000MS | Memory Limit: 65535KB |
Submissions: 95 | Accepted: 35 |
Sample Input
3/88
Sample Output
1/30 + 1/1320
#include <stdio.h>
int main(void)
{
int a,b,c;
while(scanf("%d/%d",&a,&b)!=EOF)
{
while(b%a!=0)
{
c = b/a+1;
a = a*c-b;
b = b*c;
printf("1/%d + ",c);
}
printf("1/%d\n",b/a);
}
return 0;
}
下面的這個也是正確
#include<stdio.h>
int main()
{
int zzxc(int a,int b);
int r,a,b,k,i=0,c[100],t,x,y;
scanf("%d/%d",&a,&b);
r=zzxc(a,b);
a=a/r;
b=b/r;
x=a;
y=b;
while(a!=1)
{
t=b/a;
c[i++]=t+1;
a=x*(t+1)-b;
b=y*(t+1);
r=zzxc(a,b);
a=a/r;
b=b/r;
x=a;
y=b;
}
c[i]=b;
printf("1/%d",c[0]);
for(k=1;k<=i;k++)
printf(" + 1/%d",c[k]);
printf("\n");
return 0;
}
int zzxc(int a,int b)
{
int c;
c=b%a;
while(c)
{
b=a;
a=c;
c=b%a;
}
return a;
}