为什么这个程序没有正确找到数字频率?

Why is this program not finding the digit frequency correctly?

a = int(input())
digit = 0
count=0
temp = 0
for i in range(0,10):
    temp=a
    count = 0
    while(temp>0):
        digit = temp%10
        if digit == i:
         count+=1
        temp=temp/10
    if count>0:
      print(f'{i}\t{count}')

此程序的输出始终显示为最后一位数字的频率为 1,不给出其他数字的频率。 就像我的输入是 1991, 它的输出将是

1   1

我用更好的版本重写了你的代码。

在我的代码中,我创建了一个字典来存储每个数字的出现次数: 1. 查找该数字是否存在。是的,然后创建一个计数为 1 的字典;否则向现有字典添加 1 个值

a = input("Enter your number:")
str1 = str(a)
unique_number = {}
for each in str1:
    if(each not in unique_number):
        unique_number[each] = 1;
    else:
        unique_number[each] += 1;
        
for each in unique_number:
    print(unique_number[each])

您只有一个计数器,但可能有很多值,而且您为每个数字重置了它。最后,双循环如果不需要且效率低下。

这是一个基于相同逻辑的简单工作代码。我在这里使用 collections.Counter 来保存计数,并使用 divmod 的单个循环来计算带余数的整数除法。

a=1991

from collections import Counter

c = Counter()

while a>0:
    a,r = divmod(a, 10)
    print(a,r)
    c[r]+=1

print(c)

输出:

Counter({1: 2, 9: 2})

是因为temp = temp/10.

举个例子,1991。这个数字除以 10 等于 199.1。在下一次迭代中取mod(%),结果是9.099999999999994,不等于任何数字。

要修复它,您可以 (i) 将除法解析为 int 为 temp = int(temp/10)(ii) 解析将数字转换为 digit = int(temp % 10)(iii) 甚至更好,执行整数除法 temp//10,如 @mozway 所述。

然后,您将获得预期的输出:

1       2
9       2

您的代码中的问题是 temp = temp/10,在 Python 中除法导致浮点值,其中值始终 > 0。使用 temp = int(temp/10) 这将修复您的代码并检查提到的其他方法以上。