当前位置: 代码迷 >> 综合 >> UVa 202 Repeating Decimals 循环小数问题
  详细解决方案

UVa 202 Repeating Decimals 循环小数问题

热度:32   发布时间:2023-12-05 12:00:04.0

//算法总结:

//对于a / b

//它的余数最多只有b种(即从0到b-1)

//所以当被除数c在前面出现过时,则表示出现了循环节

//循环节即为上一个c的位置到当前c的位置中间的部分

这道题总体不算难,并且目前网上已经有很多题解啦,但我还是受到巧妙数学算法和数学规律的震撼,所以就发表这篇博文啦。

同时自己也要多学习学习标记数组的用法。

#include <stdio.h>
#include <string.h>
#define MAXN 10005int ans[MAXN] , judge[MAXN] ;//judge数组用来记录每个被除数出现的位置int main ()
{//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);int first = 1;int a,b;while(scanf("%d %d",&a,&b)!=EOF){memset(judge,0,sizeof(judge));int i = 1,j;//i是被除数的位置变量printf("%d/%d = %d.",a,b,a/b);a %= b;while(!judge[a]){judge[a] = i;a *= 10;ans[i] = a / b;i++;a %= b;}for(j=1;j<judge[a];j++) printf("%d",ans[j]);printf("(");if(i-1<=50){for(j=judge[a];j<i;j++) printf("%d",ans[j]);}else{for(j=judge[a];j<=50;j++) printf("%d",ans[j]);printf("...");}printf(")\n");printf("   %d = number of digits in repeating cycle\n\n",i-judge[a]);}
}

  相关解决方案