PAT_乙级_1021,python中 / 与 //

Tani ·
更新时间:2024-11-10
· 698 次阅读

Python中的除法 第一种是:/ ,普通的除法。 第二种是:// ,官方称为地板除(floor division),得到的结果永远是整数。

对于除法,官方的解释是这样的:

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,还望高手指点。


作者:奥特曼丶毕健旗



Python pat

需要 登录 后方可回复, 如果你还没有账号请 注册新账号