无限循环小数POJ1930
生活随笔
收集整理的這篇文章主要介紹了
无限循环小数POJ1930
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:給定一個無限循環小數,求其分數形勢,要求分母最小
分析:看了別人的題解才做出來的,將無限循環小數轉化成分數,分為純循環和混循環兩種形式。
? ? ?(1)對于純循環:用9做分母,有多少個循環數就幾個9,比如0.3,3的循環就是9分之3,0.654,654的循環就是999分之654, 0.9,9的循環就是9分之1,以此類推。
? ? ? (2)混循環:用9和0做分母,首先有幾個循環節就幾個9,接著有幾個沒加入循環的數就加幾個0,再用小數點后面的數減 沒加入循環的數,比如0.43,3的循環,有一位數沒加入循環,就在9后面加一個0做分母,再用43減4做分子,得 90分之39,0.145,5的循環就用9后面加2個0做分母,再用145減14做分子,得900分之131,0.549,49的循環,就 用99后面加1個0做分母,用549減5做分子,最后得990分之545,以此類推,能約分的要化簡。
本題沒有說明循環節在哪一位,因此每一位進行枚舉,取分母最小的就是所求 ,注意學會STL中String的用法。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <vector> 6 #include <algorithm> 7 #include <set> 8 #include <map> 9 #include <bitset> 10 #include <cmath> 11 #include <queue> 12 #include <stack> 13 using namespace std; 14 string s; 15 long long gcd(long long a,long long b) 16 { 17 if(b==0) return a; 18 return gcd(b,a%b); 19 } 20 int main() 21 { 22 while(cin>>s) 23 { 24 if(s=="0") break; 25 string digit=s.substr(2,s.length()-5); 26 int n=digit.length(); 27 long long m=atoi(digit.c_str()); //小數點后面的數 28 long long fmmin,fzmin; 29 fmmin=1<<30; 30 for(int i=1;i<=n;i++) 31 { 32 string cnt=digit.substr(0,n-i); 33 long long res=m-atoi(cnt.c_str()); //分子 34 long long ans=pow(10,n)-pow(10,n-i); //分母 35 long long num=gcd(res,ans); 36 res/=num; //最簡形式 37 ans/=num; 38 if(fmmin>ans) 39 { 40 fmmin=ans; 41 fzmin=res; 42 } 43 } 44 cout<<fzmin<<"/"<<fmmin<<endl; 45 } 46 return 0; 47 } View Code?
轉載于:https://www.cnblogs.com/wolf940509/p/5792439.html
總結
以上是生活随笔為你收集整理的无限循环小数POJ1930的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: anjularjs 路由
- 下一篇: jQuery设置radio、select