1. 程式人生 > >埃及分數 把一個分數分解成n個 m分之一的形式

埃及分數 把一個分數分解成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) 步驟三:重複步驟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

Description 分子為1 的分數稱為埃及分數,現輸入一個真分數,請將該分數按下面的方法分解為埃及分數: 1.若真分數的分子a能整除分母b,則真分數經過化簡就可以得到埃及分數; 2.若真分數的分子不能整除分母,則可以從原來的分數中分解出一個分母為b/a+1的埃及分數; 3.用這種方法將剩餘部分反覆分解,最後可得到結果。如:8/11=1/2 + 1/5 + 1/37 + 1/4070。
Input 一個分數如A/B的形式
Output 見SAMPLE OUTPUT,注意空格位置在加號前後都有

Sample Input

3/88

Sample Output

1/30 + 1/1320
Hint
Source
#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;
}