您的位置:首页 > 其它

笔试题——输出循环小数的循环节

2011-05-12 20:24 232 查看
求一个分数对应小数的循环节。、

思路:

我们分别用x和y表示分子和分母,先求出整数部分x div y和余数部分x mod y,那么小数部分就是重复将余数部分乘以10再进行整除运算和求余运算,直到出现循环或余数为0时结束。
我们不妨从余数入手,因为小数部分整除的结果是由上一次运算的余数决定的,如果某一次运算产生的余数跟前面产生的余数相同,则说明循环开始。

参考代码:

#include<stdio.h>
#define mn 1000
void main()
{
int i,m,n,r,t;
int p[mn],q[mn];

for(i=0;i<mn;i++) //给数组p初始化值全为-1
{
p[i]=-1;
q[i]=0;
}

printf("input :m,n(0<=m<n<=1000)= ");
scanf("%d%d",&m,&n);

t=0; //初始化值
r=m; //把被除数赋给r

while(r!=0&&(p[r]==-1)) //循环条件当r不为0且p[r]=-1时执行循环体
{
p[r]=t;				//余数r第一次出现的位置
r=10*r;				//把被除数扩大10倍,以至于取第一个小数

t++;
q[t]=r/n;			//计算小数点后t位的值:取整,即为m/n的小数从小数点开始逐个取出放到数组q中
r=r%n;				//算完一位就去掉一位,即取余对n
}

printf("m/n = 0.");		//因为m<n,所以m/n整数部分0,所以先输出'0.'
if (r!=0)				//被除数不为0就执行以下语句
{
for(i=1;i<=p[r];i++)   //输出循环小数中前面非循环的部分
printf("%d",q[i]);

printf("(");			//输出循环的小数放在括号中

for(i=p[r]+1;i<=t;i++)
printf("%d",q[i]);

printf(")");
}
else					//被除数为0的情况
for(i=1;i<=t;i++)	//输出不循环的小数
printf("%d",q[i]);
printf("/n");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐