Bearox 程式設計之路
阿新 • • 發佈:2019-01-25
動態規劃做得好膩啊!但是前幾天的小測試,來了一個動態規劃,結果還是搞不出來。換換口味,就去做杭電的題目,結果wa的好久。好不爽啊,HDU1717挺有趣的一個題目,把小數轉換成分數。一直錯的測試資料是0.000(5)就是前面算出來是0的。
說一下迴圈小數轉換成分數的過程吧,這個在初中的時候有學過。
就是乘一個數然後剪掉迴圈部分,這個還是來看個例子你就能明白了:
比如
設x=0.32(67) //()裡面的表示迴圈的部分
n=0.32(67)*100 = 32.(67) //100是因為不迴圈部分有兩位。後面的67依舊迴圈。
m=0.32(67)*10000 = 3267.(67) //10000是32和迴圈部分加起來有四位。67依舊迴圈。
接下去就很明瞭了m - n = x*(10000-100)
x=(m-n)/(10000-100)
算出來以後不要忘記化簡,化簡其實就是求一下兩個數的最大公約數
下面是我的程式碼
#include<cstring> #include<cstdio> int n; char str[30]; bool tt; int gcd(int a, int b) { if(a == 0) return b; if(b % a == 0) return a; else return gcd(b % a, a); } int main() { int i, j; int x, y; int k, p; scanf("%d", &n); while(n--) { getchar(); scanf("%s", str); j = strlen(str); tt = 0; for(i = 2; i < j; ++i) { if(str[i] == '('){ tt = 1; break; } } if(tt == 0){ x = str[2] - '0'; y = 10; for(i = 3; i < j; ++i) x = x * 10 + (str[i] - '0'), y *= 10; j = gcd(x, y); printf("%d/%d\n", x / j, y / j); } else{ x = 0; k = 1; i = 2; for( ; str[i] != '('; ++i) x = x * 10 + (str[i] - '0'), k *= 10; y = x; p = k; for(++i; str[i] != ')'; ++i) y = y * 10 + (str[i] - '0'), p *= 10; y -= x; x = p - k; j = gcd(x, y); printf("%d/%d\n", y / j, x / j); } } return 0; }