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

poj1930解法(C++),poj1930解法

編輯:C++入門知識

poj1930解法(C++),poj1930解法


這道題題意如下:給出一個循環小數,將它化成分數並化簡為最簡分數,然後輸出該分數。由於不知道這些循環小數從哪開始是循環節,於是就規定,輸出當該小數所化成的分數分母最小時,該小數所化成的分數。(原題地址:http://poj.org/problem?id=1930)

要想解決這道題,首先應該了解如何將循環小數化為分數:

一,純循環小數化分數:循環節的數字除以循環節的位數個9組成的整數。例如: 
0.3333……=3/9=1/3; 
0.285714285714……=285714/999999=2/7. 
二,混循環小數:(例如:0.24333333……)不循環部分和循環節構成的的數減去不循環部分的差,再除以循環節位數個9添上不循環部分的位數個0。例如: 
0.24333333…………=(243-24)/900=73/300 
0.9545454…………=(954-9)/990=945/990=21/22

這便是循環小數化成分數的方法,知道這個後,解決這道題也好辦了。

代碼如下:

 1 /*
 2     Name:poj1930 
 3     Copyright: 
 4     Author: yuyang
 5     Date: 29/10/16 11:58
 6     Description: 
 7 */
 8 
 9 #include<cstdio>
10 #include<stdlib.h>
11 #include<algorithm>
12 #include<cstring>
13 #include<string>
14 #include<iostream>
15 using namespace std;
16 string str;
17 
18 //判斷兩數的最大公因數 
19 int gcd(int x,int y){
20     int ret;
21     if(y==0){
22         ret=x;
23     }else if(x<y){
24         ret=gcd(y,x);
25     }else{
26         ret=gcd(y,x%y);
27     }
28     return ret;
29 }
30 
31 //將所得到的分數化簡,得到當分數為最簡分數時分子和分母的值 
32 pair<int,int> jh(int x,int y){
33     int li=gcd(x,y);
34     if(li==1){
35         return make_pair(x,y);
36     }else{
37         return jh(x/li,y/li);
38     }
39 }
40 
41 int main(){
42     while(cin>>str&&str.size()!=1){
43         int fmmin=99999999;
44         int fzmin;
45         int yjr=0;int start,end,fxhj;
46         //判斷小數部分是從第幾位開始,從第幾位結束(開頭的0算一位,小數點算一位),start為起始位數,end為結束位數 
47         for(int i=0;i<str.size();i++){
48             if(yjr==0&&str[i]=='.'){
49                 start=i+1;
50                 yjr=1;
51             }
52             if(yjr==1&&str[i+1]=='.'){
53                 end=i;
54             }
55         }
56         end-=2;
57         for(int i=start;i<=end;i++){//求出當從第i位開始為循環節時,該小數對應的分數值,並判斷在此情況下分母是否取最小值 
58             int fz=0,fm=0;//fz為分子值,fm為分母值
59             /*
60                 一,純循環小數化分數:循環節的數字除以循環節的位數個9組成的整數。例如: 
61                 0.3333……=3/9=1/3; 
62                 0.285714285714……=285714/999999=2/7. 
63                 二,混循環小數:(例如:0.24333333……)不循環部分和循環節構成的的數減去不循環部分的差,再除以循環節位數個9添上不循環部分的位數個0。例如: 
64                 0.24333333…………=(243-24)/900=73/300 
65                 0.9545454…………=(954-9)/990=945/990=21/22
66             */ 
67             for(int j=i;j<=end;j++){
68                 fz=fz*10+(str[j]-'0');
69                 fm=fm*10+9;
70             }
71             int plus=0;
72             if(i>start){
73                 for(int j=start;j<i;j++){
74                     plus=plus*10+(str[j]-'0');
75                     fm=fm*10;
76                 }
77                 int qian=plus;
78                 for(int j=i;j<=end;j++){
79                     qian=qian*10;
80                 }
81                 qian=fz+qian;
82                 fz=qian-plus;
83             }
84             //判斷分母是否取最小值 
85             if(jh(fz,fm).second<fmmin){
86                 fmmin=jh(fz,fm).second;
87                 fzmin=jh(fz,fm).first;
88             }
89         }
90         printf("%d/%d\n",fzmin,fmmin);
91     }
92     return 0;
93 }

我將這個代碼提交到poj後通過了:

 

 

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