题目链接https://vjudge.net/problem/UVA-202
输入整数a和b(0≤a≤3000,1≤b≤3000),输出a/b的循环小数表示以及循环节长度。例如a=5,b=43,小数表示为0.(116279069767441860465),循环节长度为21。
具体输出格式和要求请看原题链接。
分析:每次计算之后保存余数,当发现计算后的余数在之前出现过就会循环。第一次出现的点s_start,当前点是s_end;然后按照要求输出。
#include<stdio.h>
#include<string.h>
#define maxn 3000
int sh[maxn],yu[maxn];//分别保存商和保存余数
int main(){
int a,b;
while(scanf("%d%d",&a,&b)!=EOF){
int s_start=0,s_end=0;
memset(sh,0,sizeof(sh));
memset(yu,0,sizeof(yu));
printf("%d/%d = %d.",a,b,a/b);
yu[0]=a%b;
for(int i=0;i<3000;i++){
sh[i]=yu[i]*10/b;
yu[i+1]=yu[i]*10%b;
for(int j=0;j<i+1;j++){
if(yu[j]==yu[i+1]){s_start=j;s_end=i+1;goto gg; }
}
}
gg: for(int i=0;i<s_start;i++) printf("%d",sh[i]);
printf("(");
if(s_end-s_start<=50){
for(int i=s_start;i<s_end;i++)
printf("%d",sh[i]);
}else{
for(int i=s_start;i<s_start+50;i++)
printf("%d",sh[i]);
printf("...");
}
printf(")\n %d = number of digits in repeating cycle\n\n",s_end-s_start);
}
return 0;
}