有理数分解-数论
題目描述 Description
任何一個[0,1]中的有理數p/q(p、q均為自然數)一定可以分解成1/r1+1/r2+1/r3+…+1/rk,且r1<r2<r3<…<rk。當然這樣的分解不是唯一的,如5/6=1/2+1/3=1/2+1/5+1/8+1/120,第一個分解式中的第二項比第二個分解式中的第二項大,因此我們可以定義第一個分解式比第二個分解式大。
程序要求找出p/q的最大分解式。
?輸入輸出格式 Input/output 輸入格式:鍵盤輸入p、q,1≤p≤q≤50
輸出格式:
從小到大依次輸出分解式中的每個分母,一行輸出一個數 ?輸入輸出樣例 Sample input/output 樣例測試點#1
輸入樣例:
5 6
輸出樣例:
2 3
思路:
假設1/r是能從p/q中分解出來的最大分子為1的真分數,則1/r≤p/q<1/(r-1)①
又因為p/q-1/r=(p×r-q)/(q×r)②
根據①可知,p×(r-1)<q,所以p×r-p<q,代入②中可看出,每次待分解的分數的分子一定單調下降,所以就可以用單精度除法(高精度除以普通整數)解決本題。
注意:在輸入p、q后要對分數進行化簡。
?
代碼如下:
1 #include <stdio.h> 2 int gcd(int a,int b)//求最大公約數 3 { 4 int r=a%b; 5 while(r>0) 6 { 7 a=b; 8 b=r; 9 r=a%b; 10 } 11 return b; 12 } 13 int main() 14 { 15 int p,q; 16 int cm;//當前最大公約數 17 int r; 18 scanf("%d%d",&p,&q); 19 while(p>0) 20 { 21 cm=gcd(p,q); 22 if(cm>0) 23 { 24 /*===========*///化簡分數 25 p=p/cm; 26 q=q/cm; 27 /*===========*/ 28 } 29 if((q%p)>0)//如果不能分解為最終的1/rk 30 { 31 r=q/p+1; 32 } 33 else 34 { 35 r=q/p; 36 } 37 printf("%d\n",r); 38 p=p*r-q;//減掉 39 q=q*r; 40 } 41 return 0; 42 }?
轉載于:https://www.cnblogs.com/geek-007/p/6287397.html
總結
- 上一篇: 有意思的故事
- 下一篇: python将注释写入xml_向xml文