小数循环节
- 题目
- 迭代器相关
- 查找
- 选取元素
- 分析
- 代码
题目
要求你对给定的两个整数做除法,如果是有限小数,直接表达。如果是无限循环小数,用方括号标出它的循环节。
【输入】1/7
【输出】0.[142857]
再例如,12345/1700:
7.26[1764705882352941]
迭代器相关
查找
- 在容器remainder中查找a元素
vector<int>::iterator x=find(remainder.begin(),remainder.end(),a);
选取元素
- vector a,类似数组选取元素a[4]
- 迭代器选元素,vector::iterator i=a.begin(),此时*i类似于a[0]。
- 如果vector::iterator j=a.begin()+5,则*j=a[5]
分析
- 用vector来存贮商quotient和余数remainder
- 商和余数是一一对应的关系
- 余数为0,说明是除尽,将vector中对应的元素打印输出
- 在vector中查找余数是否出现过,如果有同样的余数,说明是循环小数,相应打印输出。
- 有相同的余数,则为判定循环节的标志。
代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){int a,b;cin>>a>>b;cout<<a/b<<".";a=a%b;vector<int>quotient,remainder;remainder.push_back(a);while(true){if(a==0){for(vector<int>::iterator i=quotient.begin();i!=quotient.end();++i){cout<<*i;}break;}quotient.push_back(a*10/b);a=a*10%b;vector<int>::iterator x=find(remainder.begin(),remainder.end(),a);if(x==remainder.end())remainder.push_back(a);else{vector<int>::iterator j=quotient.begin();for(vector<int>::iterator i=remainder.begin();i!=x;++i){cout<<*j;++j;}cout<<"[";for(;j!=quotient.end();++j)cout<<*j;cout<<"]";break;}} return 0;
}