题目: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循环外面,而不能放在里面。
② 注意输出格式!!!一是题目要求小数