循环小数:
题目描述:
假设输入a与b,当a=5,b=43,a/b得到无限循环小数,0.116279069767441860465,5后面将会循环下去,他要求你计算循环节的长度(就是不循环的长度),并且还要你输出循环节的数字、
Input:
5 43.
Output:
0.(116279069767441860465) 21.
思路分析:
这道题可以用数组去记录a/b所得的商,但是如何去找循环节的位置呢,那么可以想到当(a%b与a/b)与下一次的(a%b与a/b)相等说明找到了循环节,在用一个数组记录循环节的位置就行了。
代码:
#include<stdio.h>
int main()
{
int e[3010],e1[3010],e2[3010];
//e记录商,e1记录循环节出现的位置,e2记录余数
int b,c,d=0,h=0;
scanf("%d %d",&b,&c);
e[d++]=b/c;
b=b%c;
while(!e2[b]&&b)//判断如果该次余数与下次运算的余数相等,说明将会无限循环下去
//因为他们除数相等,当被除数(余数)相等时,说明后面将会一直循环相同
{
e2[b]=d;//记录该次的余数
e1[d]=b;//记录循环节所出现的位置
e[d++]=b*10/c;//记录商
b=b*10%c;//下次运算的余数
}
printf("%d.",e[0]);//输出前面小数点
for(c=1;c<d;c++)//开始输出
{
if(e1[c]==b && b)
{
printf("(%d",e[c]);
h=c;
}
else
printf("%d",e[c]);
}
if(b)//假设b为0,说明刚好整除不是无限循环小数
printf(")");
else
printf("(0)");
printf(" %d",d-h);//输出循环节的长度。
}
来源:CSDN
作者:xiaosuC
链接:https://blog.csdn.net/xiaosuC/article/details/104169147