程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 【循環小數性質】HDU 1717——小數化分數2

【循環小數性質】HDU 1717——小數化分數2

編輯:C++入門知識

這個題是個模擬,小數化分數的一般步驟可以看我的上一篇BLOG,無非除以10的位數次方,再約分一下,這個題也是如此。比較復雜的是無限小數的處理。   分三種情況:   1、純循環小數   2、純不循環小數   3、混合小數   這三種的轉化各有自己的性質,結論如下(證明過程可以見百度)   1、有限小數的話把小數點後面的數除以10(一位數).100(兩位數).1000(三位數)等, 2、如果是無限循環小數那就把循環的數除以9、99、999(同上) 3、如果是混循環小數,循環數字為兩位情況下不循環的數字一位則除以990,兩位則9900,並加上不循環小數數值乘以990或者9900。 即:分子=不循環部分和循環部分連起來-不循環部分。分母=99..(循環位數)0..(不循環位數) 剩下的就是模擬字符串提取之類的細節問題了。另外要注意的是POW函數最好自己寫,有的時候會丟失精度導致WA. [cpp]   #include <iostream>   #include <string>   #include <cmath>   #include <stdlib.h>   using namespace std;      int gcd(int a,int b)   {       if(b==0)           return a;       return gcd(b,a%b);   }      int lcm(int a,int b)   {       return (a*b)/gcd(a,b);   }      int my_pow(int x,int n)   {       int res=1;       for(int i=1;i<=n;i++)           res*=x;       return res;   }         int main()   {       int testcase;       cin>>testcase;       for(int a=0;a<testcase;a++)       {           string tar;           string integerstr,loopstr;           int integer,loop;           int loopsize=0,intsize=0;                      cin>>tar;           if(tar.find('(',0)==-1)   //第一種情況,純整數,不含循環節            {               for(int i=2;i<tar.size();i++)               {                   integerstr+=tar[i];                   intsize++;               }               integer=atoi(integerstr.c_str());               int cm;               cm=gcd(integer,my_pow(10,intsize));               cout<<integer/cm<<"/"<<my_pow(10,intsize)/cm<<endl;            }           else if(tar[2]=='(')     //第二種情況,純循環小數            {               for(int i=3;i<tar.size()-1;i++)               {                   loopstr+=tar[i];                   loopsize++;               }               loop=atoi(loopstr.c_str());                              int div=my_pow(10,loopsize)-1;               int cm=gcd(loop,div);               cout<<loop/cm<<"/"<<div/cm<<endl;           }           else if(tar.find('(',0)!=-1||tar.find('(',0)!=2 )           {               int pos;               int intf;               int res;               for(int z=0;z<tar.size();z++)               {                   if(tar[z]=='(')                       pos=z;               }               for(int i=2;i<pos;i++)               {                   integerstr+=tar[i];                   intsize++;               }               for(int j=pos+1;j<tar.size()-1;j++)               {                   loopstr+=tar[j];                   loopsize++;               }                              string fenzistr;               int fenzi;                              fenzistr=integerstr+loopstr;               fenzi=atoi(fenzistr.c_str());               integer=atoi(integerstr.c_str());               loop=atoi(loopstr.c_str());               res=fenzi-integer;                              string intfm;     //例如0.32(56),原始分母為9900,0的個數等於非循環節的個數,9的個數等於循環節的個數                               for(int p=0;p<loopsize;p++)               {                   intfm+='9';               }               for(int o=0;o<intsize;o++)               {                   intfm+='0';               }               intf=atoi(intfm.c_str());                              int cm=gcd(res,intf);                              cout<<res/cm<<"/"<<intf/cm<<endl;                          }              }          return 0;   }     

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved