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

hdu 1717 小數化分數2

編輯:C++入門知識

                                     循環小數化分數   ①純循環小數化分數 純循環小數化分數,分子就是一個循環節的數字所組成的數,分母的各位數字都是9,9的個數等於一個循環節數字的個數,能約分的要約分。    例1: 把0.7化成分數。  0.7×10=7.777……① 0.7=0.777……② 由①—②得     0.7×9=7 所以    0.7=7/9   例2: 把5.1 2 3化成分數。 0.123×1000=123.123123……①       0.1 2 3=0.123123……② 由①—②得:    .    .         0.1 2 3×999=123 所以    .    .         0.1 2 3=123/999 ②混循環小數化分數,第二個循環節以前的小數部分的數字所組成的數,減去小數部分中不循環部分的數字所組成的數而得到的差作分子,分母的頭幾位數字是9,末幾位數字是0,9的個數和一個循環節的位數相同,0的個數和不循環部分的位數相同。  例如: 把0.478化成分數。  0.478×1000=478.7878……①   0.478×10= 4.7878……② 由①—②得:    0.478×990=474 所以 0.478=474/990  例如: 把0.421化成分數 0.421×1000=421.11111……① 0.421×100=42.11111……② 由①—②得:  0.421×900=421—42=379所以   0.421=379/900     ——————————————————————————————————————————————————————————————     十多天沒刷題了!!!手都生了!!!   這題不是很難,主要是找到小數化成分數的技巧!!!   由於自己的粗心有一個地方的輸出的數字沒有化簡導致錯了好多次(囧)!!!   還是要努力呀!!!!   ————————————————————————————————————————————————————————————————————   #include<stdio.h>   #include<string.h>     __int64 P(__int64 a,__int64 b) {     __int64 t,r;     if(a<b)     {         t=a;a=b;b=t;     }     do     {         r=a%b;         a=b;         b=r;     }while(r!=0);     return a;     } int main() {     __int64 T,len,i,flag,num1,num2,j,q,gcd,flag2,nu1,nu2,n1,n2;     char str[50],str1[50],str2[50];     scanf("%I64d",&T);     while(T--)     {         scanf("%s",str);         flag=0;         len=strlen(str);         if(str[len-1]==')')             flag=1;         if(flag)         {             for(i=0;i<len-1;i++)                 if(str[i]=='(')                     break;                 q=0;                 for(j=i+1;j<len-1;j++)                 {                     str1[q]=str[j];                     q++;                 }                 num1=0;num2=0;                 for(j=0;j<q;j++)                     num1=num1*10+(str1[j]-'0');                 for(j=0;j<q;j++)                     num2=num2*10+9;                 gcd=P(num1,num2);                 num1/=gcd;num2/=gcd;         }         q=0;flag2=0;         for(i=2;i<len;i++)         {             if(str[i]=='(')                 break;             str2[q]=str[i];             q++;         }         nu1=0;nu2=1;         for(i=0;i<q;i++)         {             nu1=nu1*10+(str2[i]-'0');             nu2=nu2*10;         }         if(nu1==0)         {             flag2=0;             for(i=0;i<q;i++)                 num2*=10;             q=0;         }         if(q>=1)         {             flag2=1;             gcd=P(nu1,nu2);             nu1/=gcd;nu2/=gcd;         }                  if(flag2&&!flag) { gcd=P(nu1,nu2); nu1/=gcd;nu2/=gcd;             printf("%I64d/%I64d\n",nu1,nu2); }         if(flag&&!flag2) {  gcd=P(num1,num2); num1/=gcd;num2/=gcd;             printf("%I64d/%I64d\n",num1,num2); }         if(flag&&flag2)         {             for(i=0;i<q;i++)             num2=num2*10;             n2=num2*nu2;             n1=num1*nu2+nu1*num2;             gcd=P(n1,n2);             n1/=gcd;n2/=gcd;             printf("%I64d/%I64d\n",n1,n2);         }         }     return 0; }

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