计算循环小数,输入分别是被除数和除数,输出中循环体用[]括起来,采用龟兔赛跑算法。
#include<iostream>
using namespace std;
void transform(int n,int d){ //n是分子(numerator)d是分母(denominator)
if(n*d<0){ //如果分子或分母是负数
cout<<"-";
n = abs(n),d = abs(d);
}
int integer = n/d,decimal = n-d*integer; //integer是整数部分decimal是小数部分
int turtle = decimal,rabbit = (10*decimal)%d;
int period = 1,start = 0;
cout<<integer<<"."; //输出整数部分
while(turtle!=rabbit){ //龟兔赛跑算法求出周期的整数倍
turtle = (10*turtle)%d;
rabbit = (10*(10*rabbit)%d)%d;
}
turtle = (10*turtle)%d; //计算循环周期period
for(;turtle!=rabbit;period++)
turtle = (10*turtle)%d;
turtle = rabbit = decimal; //计算循环起始位置start
for(int i=0;i<period;i++)
rabbit = (10*rabbit)%d;
for(;turtle!=rabbit;start++)
turtle = (10*turtle)%d;
turtle = decimal; //输出小数部分
for(int i=0;i<start;i++){
cout<<(10*turtle)/d;
turtle = (10*turtle)%d;
}
cout<<"[";
for(int i=0;i<period;i++){
cout<<(10*turtle)/d;
turtle = (10*turtle)%d;
}
cout<<"]";
}
int main(){
int num,den;
cin>>num>>den;
transform(num,den);
return 0;
}