对于除法,官方的解释是这样的:
Division (/) always returns a float. To do floor division and get an integer result (discarding any fractional result) you can use the // operator; to calculate the remainder you can use %.
我们大概了解了除法( ̄︶ ̄)↗ ,而在PAT乙级1021题——个位数统计中,我们需要用到 **//**来操作,不然会出现返回非零的情况。
那么对于这道题:
输入格式:
每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。
输出格式:
对 N 中每一种不同的个位数字,以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数 M。要求按 D 的升序输出。
因为是个位数字统计,所以总是逃不开只统计0-9就可以了。鄙人直接想到的就是用字典。
至于取数,我们也再熟悉不过了,除10取余就可以了。
一切看似容易,但是问题就在除法这里了。题目给出的是1000位的正整数,我们需要注意的是,python中的除法有些特殊。
举例说明:
number = int(input())
nums = [i for i in range(10)]
times = [0]*10
lis = dict(zip(nums, times))
while number!=0 :
lis[number%10] += 1
number = number // 10
# 1.number = number / 10
# 在1.中,直接除结果存在小数所以导致keyerror(字典key无小数)。
# 2.number = int(number / 10)
# 在2.中,当number为999999999999999999(20个9)时,就会出问题。
for k,v in lis.items():
if v!=0:
print('{0}:{1}'.format(k, v))
代码第一行得到输入,并强制转换为int型(因为题目说输入是正整数)。
代码第二至四行创建字典,key为[0-9],value初始化为0。
代码五至七行统计个位数。
代码八至十行按格式输出。
在注释2.中,我们发现当输入为99999999999999999999(20个9)时,
int(number / 10)会得到10000000000000000000(19个0)的结果,
本人猜测是因为,20个9在二进制计算当中已经十分十分十分接近100000000000000000000(1后20个0)了,所以得到的结果就是这样的。
然而地板除,把近似的情况删掉了,所以就能得到期望的结果。
emm,还望高手指点。