for _ in range(int(input())):
n=int(input())
least_prime = [0] * (1000001)
count=0
for i in range(2, int(1000001**0.5 + 1)):
if least_prime[i] == 0:
least_prime[i] = i
for j in range(i * i, 1000000, 2*i) :
if (least_prime[j] == 0) :
least_prime[j] = i
for i in range(2, 1000001) :
if least_prime[i] == n:
count+=1
print(count)
谁能降低问题的时间复杂性?也许试了一个小时,但再简单不过了。
第一个for loop
是测试用例的数量问题是关于有多少个数在10^6
内以n
作为它们的最小素数因子?
您的代码有3个问题:
int(1000001**0.5 + 1)
如何修复它?简单,首先只做一次筛子,不需要重复完全相同的事情10**6次,或者不管你有多少个测试用例,两个或更多都是两次太多(如果n始终是素数,即78498,这是素数小于
10**6
),另外两个点是简单的修复我会把它放在它自己的函数中,这使它更易于重用和使用,对于计数部分,如何操作没有问题,但是使用一个^{} 可以更方便地同时进行所有计数
所以现在你的测试可以简单到
为了完整起见,这里是如何不用计数器就能完成的
但这也太长了,一个列表已经为我们提供了
.count
计数器更好,因为你只需一次就可以得到所有答案,如果需要的话,你可以用一本普通字典自己编一本,但我把它作为练习留给读者
相关问题 更多 >
编程相关推荐