模擬題,將分?jǐn)?shù)轉(zhuǎn)換成帶循環(huán)節(jié)小數(shù)形式。
模擬小學(xué)算術(shù)方法即可。
用一個(gè)char數(shù)組存儲(chǔ)結(jié)果。用一個(gè)int數(shù)組來(lái)存儲(chǔ)當(dāng)余數(shù)為i時(shí),i除以被除數(shù)得到的余數(shù)在char數(shù)組的索引值。
如果某余數(shù)重復(fù)出現(xiàn),說(shuō)明出現(xiàn)了循環(huán)。從該余數(shù)第一次出現(xiàn)開(kāi)始表示循環(huán)節(jié)即可。只是輸出比較麻煩,要小心處理。
#include?<iostream>
#include?<fstream>
using?namespace?std;
ifstream?fin("fracdec.in");
ofstream?fout("fracdec.out");
#ifdef?_DEBUG
#define?out?cout
#define?in?cin
#else
#define?out?fout
#define?in?fin
#endif
int?pos[100001];
char?result[100010];
void?solve()
{
????memset(pos,-1,sizeof(pos));
????int?n,d;
????in>>n>>d;
????int?integer?=?n/d;
????int?start;
????int?cnt?=?1;
????out<<integer<<'.';
????do{
????????cnt++;
????????integer/=10;
????}while(integer);
????cnt++;
????start?=?cnt;
????n%=d;
????while(pos[n]==-1){
????????pos[n]=cnt++;
????????result[pos[n]]?=?n*10/d+'0';
????????n?=?n*10%d;
????????if(n==0)?break;
????}
????if(n==0){
????????for(int?i=start;i<cnt;++i){
????????????out<<result[i];
????????????if((i)%76==0)
????????????????out<<endl;
????????}
????????if((cnt-1)%76!=0)
????????????out<<endl;
????}else{
????????int?i;
????????for(i=start;i<pos[n];++i){
????????????out<<result[i];
????????????if(i%76==0)
????????????????out<<endl;
????????}
????????out<<'(';
????????i++;
????????if(i%76==0)
????????????out<<endl;
????????cnt++;
????????for(;i<cnt;++i){
????????????out<<result[i-1];
????????????if(i%76==0)
????????????????out<<endl;
????????}
????????out<<')';
????????out<<endl;
????}
}
int?main(int?argc,char?*argv[])
{
????solve();?
????return?0;
}