CUG 数学进阶
題目鏈接:http://acm.cug.edu.cn/JudgeOnline/contest.php?cid=1047
.
.
.
I 題目鏈接:http://acm.cug.edu.cn/JudgeOnline/problem.php?cid=1047&pid=8
題意:給你一個(gè)0.xxx...表示的無限循環(huán)小數(shù),求其表示成分?jǐn)?shù)形式時(shí)分母最小的那個(gè)分式。
思路:首先我們要知道如何將一個(gè)無限循環(huán)小數(shù)(已知循環(huán)結(jié))化為分?jǐn)?shù),剩下的過程就是枚舉所有循環(huán)結(jié)來尋找滿足題目要求的答案。
下面來推導(dǎo)下如何將一個(gè)無限循環(huán)小數(shù)化為分?jǐn)?shù):
X = 0.a1a2…an(b1b2…bm) ?(1)
X *10^n = a1a2…an. (b1b2…bm) ?(2)
X *10^n - a1a2…an = 0. (b1b2…bm) ?(3) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
(X *10^n - a1a2…an)*10^m = b1b2…bm. (b1b2…bm) ? ? (4)
(X *10n - a1a2…an)*10^m - b1b2…bm = 0. (b1b2…bm) ?(5)
(3)和(5)相等,聯(lián)立解得:
X = (a1a2...anb1b2...bm - a1a2...an)/(10^(n+m) - 10^n) ? (*)
求出了(*)題目就基本做出來了。
** ?使用%[]格式可以輸入一個(gè)字符集,scanf("?0.%[0-9]...")格式可以輸入前面是0.開頭后面是...結(jié)尾,中間是由0-9內(nèi)范圍的數(shù)字字符組成。
關(guān)于更多的字符串輸入格式可以參見以前的博文C/C++中字符串的輸入問題
** atio函數(shù)的介紹
頭文件:#include <stdlib.h>
函數(shù)原型:int atoi( const char *str );
函數(shù)功能:將字符串str轉(zhuǎn)換成一個(gè)整數(shù)并返回結(jié)果。參數(shù)str 以數(shù)字開頭,當(dāng)函數(shù)從str 中讀到非數(shù)字字符則結(jié)束轉(zhuǎn)換并將結(jié)果返回。
返回值:字符串的整數(shù)表示形式
code:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <cstdlib> 6 using namespace std; 7 const int MAXN = 15; 8 typedef long long LL; 9 char str[MAXN]; 10 char ups[MAXN]; 11 char dws[MAXN]; 12 13 LL gcd(LL a, LL b) 14 { 15 return !b ? a : gcd(b, a % b); 16 } 17 18 int main() 19 { 20 while (scanf(" 0.%[0-9]...", str) == 1) 21 { 22 int len = strlen(str); 23 if (str[0] == '0' && len == 1) break; 24 LL ansu, ansd; // 分別存儲分子和分母 25 ansd = 1000000000000; 26 for (int i = 0; i < len; ++i) 27 { 28 strncpy(ups, str, i); // 拷貝前i個(gè)字符到ups作為非循環(huán)部分 29 ups[i] = 0; // 添加字符串結(jié)束符 30 strcpy(dws, str + i); // 從第i個(gè)字符開始拷貝給dws(包括字符串結(jié)束符),作為循環(huán)部分 31 int lu = strlen(ups); 32 int ld = strlen(dws); 33 LL up = atoi(ups) * (pow(10, ld) - 1) + atoi(dws); // 計(jì)算分子(atoi函數(shù)將字符串轉(zhuǎn)換成一個(gè)整數(shù)并返回結(jié)果) 34 LL down = pow(10, lu + ld) - pow(10, lu); // 計(jì)算分子 35 LL d = gcd(down, up); // 計(jì)算最大公約數(shù),分子分母約分 36 up /= d; 37 down /= d; 38 if (down < ansd) // 更新分子和分母 39 { 40 ansu = up; 41 ansd = down; 42 } 43 } 44 printf("%lld/%lld\n", ansu, ansd); // 輸出分母最小的結(jié)果 45 } 46 return 0; 47 }?
轉(zhuǎn)載于:https://www.cnblogs.com/ykzou/p/4656437.html
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
- 上一篇: MYSQL的索引类型:PRIMARY,
- 下一篇: cocos2dx-3 addImageA