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