紫书第三章课后习题——UVa202

博客介绍了如何解决UVa202问题,即找到循环小数的循环节长度。通过理解题意,博主提出将小数的每一位存储在数组中,并利用循环判断法确定循环节。关键在于当商和余数在之前的除法中出现过,且余数相同,那么两者相隔的位置即为循环节长度。博主分享了AC代码,并强调了判断循环节的简洁方法和注意点,包括输出格式和整数部分的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:UVa202

 

地址:https://vjudge.net/problem/UVA-202

 

题解:

题意很简单,就是求一个循环小数的循环节的长度。

 

思路:

    思路嘛,结合输出格式,不难想到把这个小数的每一位存进一个数组中,然后问题来了,要存储多少位才停止,换句话说,也就是如何确定一个循环节,一开始打算,对于每一个位向前匹配,可是匹配多少位才能确定一个循环节呢。后来手算了一下样例,发现小数部分的每一位上的数字都是由一次除法产生的,那么当出现两个除法,它们的被除数相同的话,又由于每次的除数不变,所以两次的商肯定一样,而它们的余数又将是下一次除法的被除数,如果这两次的余数又相同的话,那么下一次除法得到的商也将一样,由于将不断循环下去!!!

至此,判断循环节的方法就得到了,只要本次得到的商在之前某次的除法得到过,再判断两次的余数是否相同,如果余数也相同的话,那么这两次除法相隔的距离就是循环节的长度。

e.g:1/6=0…1    10/6=1…4  40/6=6…4    40/6=6…4   40/6=6…4

 

实现:

    至于实现嘛,根据思路,不难知道要记录的量是商、余数以及此次商在小数部分的位置。又由于小数部分的每一位(即一次除法得到的商)不大于9,所以可以用10个向量来标记,v[x]存储x出现时的位置以及当时的余数,故要定义一个结构体。

 

编程技巧:

① 由于对于每一个商,它的位置和余数都有用,所以可以定义一个结构体,向量中的元素定义为这个结构体

② 判断商之前有没有出现过,一是可以通过v[x].size()来判断

 

注意点:

① 由于整数部分的商不一定是一位数,如100/3=33…1,而且题目是要求小数部分的循环节的长度,所以整数部分的一次除法应该放在while循环外面,而不能放在里面。

② 注意输出格式!!!一是题目要求小数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值