c语言 查找循环节起点,用C语言怎么求循环小数的循环节?

满意答案

02ae427d08e371d7e90d5b995e828d6d.png

zybehqej

推荐于 2016.09.09

02ae427d08e371d7e90d5b995e828d6d.png

采纳率:43%    等级:8

已帮助:512人

1、判断循环的关键是在确定每位小数的时候,判断余数是否出现与之前的相同。

2、例程:int repetend(                     //求循环节的函数,返回值为循环长度,共3个参数

int a,              //第一个参数为被除数

int b,              //第二个参数为除数

char *Str)       //第三个参数为用于存循环节每一位的数组指针

{int Rem[255],                   //用于存余数的整型数组

Div1=a,                       //把被除数保存下来,因为后面可能会改变被除数的值

Div2=b;                       //把除数也保存下来,因为后面可能会改变除数的值

if(a==0 or b==0) return 0; //如果被除数或者除数为0,函数返回0值

if(Div1<0) Div1=Div1*-1;   //正负并不影响求循环节,所以被除数和除数都取绝对值

if(Div2<0) Div2=Div2*-1;   //正负并不影响求循环节,所以被除数和除数都取绝对值

for(;Div1*10

/*如果被除数乘以10小于除数,就通过一个循环不断让被除数乘以10,直到被除数乘以10大于

或者等于被除数,这样可以清除掉小数点后面的0.000000这些多余的数据。*/

Rem[0]=Div1%Div2;            //第一次保存余数

for(int i=0;;i++)                    //用一个死循环检索小数点后面的每一位

{Div1=Rem[i]*10;            //每一次的被除数都为前一次余数乘以10

Str[i]=Div1/Div2;            //得到第i位小数(0为第1位,1为第2位,以此类推)

Rem[i+1]=Div1%Div2;   //保存余数

if(Rem[i+1]==0)             //不管小数点后第几位,如果余数为0,说明能除尽,不会出现循环

{Str[0]=0;                    //循环节为0

return 1;}                  //函数返回1,这是根据你题目中要求的,但我觉得应该设为0比较合理

for(int j=0;j<=i;j++)        //再用一重循环比较之前所有的余数,确定循环节起始点

if(Rem[i+1]==Rem[j])

/*判断是否出现循环的关键是判断余数是否和之前的某一次相同。如果当前余数等于之前的某一

次余数,说明开始出现循环。循环点的起点为j,终点为i,循环长度为(i-j)+1位小数,当上述判断为真时,就可以结束函数*/

{for(int k=0;k<=(i-j);k++) Str[k]=Str[j+k]; //整理循环节数组

return (i-j)+1;}                                  //函数返回循环长度

}

}

00分享举报

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值