求小数的循环节

来源:互联网 发布:js鼠标滚动条事件 编辑:程序博客网 时间:2024/06/01 20:10

求小数的循环节:

如X=4,Y=7; 输出:X/Y=0.(5714285714)


解法:很简单,利用不断计算X=X%Y的值是否为0,如果为0,说明是一个有限小数,如果不为0,判断这个值之前是否出现过,如果出现过说明我们已经找到了这个小数的循环节

#include<iostream>using namespace std;#define MAXLENGTH 100int ANS[MAXLENGTH];//存储答案int r[MAXLENGTH];//存储余数int main(){int j, LEN=0;int x=6,y=6;while(true){ANS[LEN]=x/y;//表示整数部分(ANS[0])x=x%y;for(j=LEN;j>0;j--)//从余数表里往回找,直到第一个重复,余数表从下标一开始放if(x==r[j])break;//找到了第一个重复点退出if(x==0||j>0)//j表示第一个重复点,或者已经除尽,退出循环break;elser[++LEN]=x;x=x*10;}//打印结果cout<<ANS[0]<<".";for(int i=1;i<=LEN;i++){if(i==j)cout<<"(";cout<<ANS[i];}if(x!=0) cout<<")";cout<<endl;system("pause");return 0;}


上面的做法,每当精度提高一次时就要,遍历次R,判断这个余数是否出现过,效率太低!!我们知道每次计算余数的范围在0-到Y-1(Y是除数),因此我们可以保存一个大小为Y的数组R,初始为-1,每当产生一个大小为R的余数,我们可以查询R[r]是否出现过,如果出现过了,说明我们找到的了小数的循环节,如果没有,令R[r]=true


#include<iostream>using namespace std;int ANS[1000];//存放运算结果,其中ANS【0】表示整数部分int R[1000];//存放运算结果,其中ANS【0】表示整数部分void Div(int x,int y){if(y==0)return;for(int i=0;i<y;i++)R[i]=-1;int len=0;//结果的长度//计算整数部分的余数ANS[len]=x/y;x=x%y;while(x!=0&&R[x]<0){R[x]=len;//用来表示这是第几次除法产生的余数x*=10;ANS[++len]=x/y;x=x%y;}//打印小数if(x==0)//是有限小数{cout<<ANS[0]<<".";for(int i=1;i<=len;i++)cout<<ANS[i];}else{cout<<ANS[0]<<".";for(int i=1;i<=len;i++)//注意这里最后一位已经开始循环了{if(i==R[x]+1)cout<<"(";cout<<ANS[i];}cout<<")";}}int main(int argc,char* argv[]){Div(4,127);system("pause");return 0;}




0 0
原创粉丝点击