算法竞赛入门经典(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<stdio.h>
#include<string.h>
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<sub;i++)
	{
		printf("%d",arr[i]);
	}
	printf(" %d",sub-loc[a]);
	return 0;
}

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值