算法竞赛入门经典(UVA202循环小数)

题目描述:输入整数a和b(0<=a,b<=3000),输出a/b的循环小数表示以及循环节长度。例如a=5,b=43,小数表示为0.(116279069767441860465),循环节长度为21.

解题思路:

计算a/b的小数:

题目要求循环小数,简单的a/b运算必然无法正常得到答案,采用逐次计算小数点后各位的方法。

开始:a=a%b*10;

小数第一位:arr[sub]=a/b;

何种情况表明开始循环了呢?定义一数组记录被除数出现的次数,当该被除数出现第二次,即表示小数开始循环,即跳出while()进行打印。

如此循环往复得到后面各位小数的值。

#include
#include
int main()
{
	int a,b;
	scanf("%d%d",&a,&b);
	int arr[30001];           //存放各位小数 
	int res[30001];            //记录被除数出现的次数 
	int loc[30001];            //某个被除数刚出现时对应小数的位置 
	int sub=1;              //实时记录下标位置 
	a=a%b*10;
	memset(res,0,sizeof(res));
	while(res[a]==0)         //一旦被除数第二次出现,跳出循环。 
	{
		res[a]=1;
		loc[a]=sub;          //某被除数循环开始的位置记录 
		arr[sub]=a/b;        //记录小数值 
		sub++;           
		a=a%b*10;             
	}
	printf("0.");
	for(int i=loc[a];i

 

你可能感兴趣的:(算法竞赛入门经典(UVA202循环小数))