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; }