算法竞赛入门经典|习题3-8, 循环小数(UVa202)
生活随笔
收集整理的這篇文章主要介紹了
算法竞赛入门经典|习题3-8, 循环小数(UVa202)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
耗時(shí):1小時(shí)22分。
儲(chǔ)備知識(shí):
1、循環(huán)節(jié)
如果無(wú)限小數(shù)點(diǎn)后,從某一位起向右進(jìn)行到某一位止的數(shù)字循環(huán)出現(xiàn),首位銜接,則稱這個(gè)小數(shù)為循環(huán)小數(shù),這段數(shù)字為循環(huán)節(jié)。
例如: 547/7 = 78.(142857)142857。其中, 142857就是循環(huán)節(jié)。
2、循環(huán)節(jié)的最大位數(shù)
簡(jiǎn)單理解:
相除就是不斷的將因子乘10然后用分子去除,而因子最大不會(huì)超過(guò)分母,設(shè)分母為n,則因子最多為n-1種,
因此循環(huán)節(jié)最長(zhǎng)為n-1。
3、如何計(jì)算高精度小數(shù)
雖然C語(yǔ)言有%.m的用法去計(jì)算小數(shù),但到了位數(shù)變多后計(jì)算會(huì)出現(xiàn)偏差。 因此這里采用動(dòng)態(tài)數(shù)組存儲(chǔ)小數(shù)點(diǎn)后數(shù)字的方式。
代碼
#include <iostream> #include <cstdio> #include <vector> using namespace std ;int main() {int a ; //分子 int b ; //分母vector <int> v ; //存放結(jié)果cin >> a ; //輸入分子 cin >> b ; //輸入分母 a %= b ; //這一步確保a是小于b的,也就是真分?jǐn)?shù)。 //將計(jì)算結(jié)果存入 v int num = 0 ; //計(jì)數(shù),確保存入的個(gè)數(shù)滿足要求while(num != (2*b-2)) {num++ ;if(a < b) {a *= 10 ;}while(a < b) {a *= 10 ;v.push_back(0) ; }v.push_back(a / b) ; a %= b ;}//判斷循環(huán)節(jié) int j ;for(int i = 1 ; i <= (b-1) ; i++) { //循環(huán)節(jié)的位數(shù)一定不大于b-1。 for ( j = i ; j < (2 * b - 2) ; j++) {if ( v[j] != v[j % i] ) break ;}if ( j == (2*b-2) ) {cout << i ; return 0 ;}} return 0 ;}總結(jié):World Finals名不虛傳,學(xué)到了很多。
超強(qiáng)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的算法竞赛入门经典|习题3-8, 循环小数(UVa202)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 两个有序链表序列的交集 (20分)(最佳
- 下一篇: UVa1588 | 算法竞赛入门经典(第