Problem Description
1/7 = 0.142857142... 是个无限循环小数。
任何有理数都可以表示为无限循环小数的形式。
本题目要求即是:给出一个数字的循环小数表示法。
任何有理数都可以表示为无限循环小数的形式。
本题目要求即是:给出一个数字的循环小数表示法。
Input
整数,整数
每个整数范围均为:1~1000
每个整数范围均为:1~1000
Output
程序输出两个整数做除法产生的小数或无限循环小数(循环节用方括号括起)。
1,5
1,7
7,6
Sample Output
0.2
0.[142857]
1.1[6]
求循环节,主要判断是否出现循环节,如果出现商和余数都相等的情况就说明循环节出现了,所以可以把余数存在一个数组里,商存在一个数组里,然后多次求商和余数,每求出一组商一组余数就判断一次是否出现循环节
#include<stdio.h>
#include<string.h>
int s[1000],y[1000],q=0,p=0;
int flag=0;
int xun(int sh,int yu)
{
int i;
for(i=0;i<q;i++)
{
if(s[i]==sh && y[i]==yu)
{
flag=i;
return 0;
}
}
return 1;
}
int main()
{
int m,n,i,j,k;
while(scanf("%d,%d",&m,&n)!=EOF)
{
flag=0,q=0,p=0;
int t=0;
int sh,yu;
memset(s,0,sizeof(s));
memset(y,0,sizeof(y));
int jie=m/n;
if(m%n==0)
t=1;
if(m>=n)
m=m%n;
sh=m*10/n;
yu=(m*10)%n;
while(xun(sh,yu)==1)
{
s[q++]=sh;
y[p++]=yu;
yu*=10;
sh=yu/n;
yu=yu%n;
}
if(t==1)
{
printf("%d\n",jie);
continue;
}
else
{
printf("%d.",jie);
for(i=999;i>=0;i--)
{
if(s[i]!=0)
{
k=i;
break;
}
}
for(i=0;i<flag;i++)
printf("%d",s[i]);
for(i=flag;i<=k;i++)
{
if(i==flag)
printf("[");
printf("%d",s[i]);
if(i==k)
printf("]");
}
printf("\n");
}
}
return 0;
}