1. 求所有n位高逐位整除数。(20) n位高逐位整除数:从其高位开始,高1位能被1整除(显然), 高2位能被2整除,…,整个n位数能被n整除。对于指定的正整数n,共有多少个不同的n位高逐位整除数?输出每一个n位高逐位整除数。 例如:10245就是一个5位的高逐位整除数。1能被1整除,10能被2整除,102能被3整除,1024能被4整除,10245能被5整除。用Python代码编写
时间: 2023-10-25 09:09:55 浏览: 129
以下是 Python 代码实现:
```python
def dfs(n, start, cur_num, res):
if start == n + 1:
res.append(cur_num)
return
for i in range(start, n + 1):
if cur_num % i == 0:
dfs(n, i + 1, cur_num * 10 + i, res)
def find_highly_divisible_numbers(n):
res = []
dfs(n, 1, 0, res)
return res
n = 5
res = find_highly_divisible_numbers(n)
for num in res:
print(num)
```
这里使用了深度优先搜索算法,从高位开始逐个确定每一位的数字,如果当前的数字可以被当前位数整除,就继续往下搜索。当搜索到第 $n$ 位时,如果整个 $n$ 位数能被 $n$ 整除,就将其加入结果列表中。
时间复杂度为 $O(n!)$,空间复杂度为 $O(n)$。
相关问题
n位逐位整除数:从其高位开始,高1位能被1整除(显然), 高2位能被2整除,…,整个n位数能被n整除。输入n,试探索所有的n位逐位整除数并输出。
好的,这是一个有趣的问题!我来给你解答。以下是一个简单的 Python 代码实现:
```python
def find_divisible_numbers(n):
nums = []
for i in range(10**(n-1), 10**n):
num_str = str(i)
if '0' in num_str or len(set(num_str)) != n:
continue
divisible = True
for j in range(1, n+1):
if int(num_str[:j]) % j != 0:
divisible = False
break
if divisible:
nums.append(i)
return nums
```
这个函数接受一个整数 n,返回所有 n 位逐位整除数的列表。函数首先用一个 for 循环遍历所有 n 位数,然后检查这个数是否包含数字 0 或重复数字,如果是则跳过。然后,它使用另一个 for 循环来检查这个数的每个前缀是否能够被相应的数字整除。如果是,则将该数添加到结果列表中。最后,函数返回结果列表。
你可以尝试调用这个函数,像这样:`find_divisible_numbers(3)`,它会返回所有的三位逐位整除数。
任给十进制的正整数,请从低位到高位逐位输出各位数字 用循环和递归
当需要将一个十进制的正整数按位输出,无论是通过循环还是递归的方式,都可以实现。以下是两种方法的示例:
**使用循环(迭代法)**:
```python
def print_decimal_by_loop(n):
while n > 0:
digit = n % 10 # 取余得到当前位的数值
print(digit, end="") # 输出并保留当前位置
n //= 10 # 整除10,移除最低位
# 测试例子
print_decimal_by_loop(12345)
```
**使用递归(分治法)**:
```python
def print_decimal_by_recursion(n, index=0):
if n == 0:
return # 结束递归,如果没有更多位,停止
digit = n % 10
print(digit, end="")
print_decimal_by_recursion(n // 10, index + 1) # 递归处理剩余位,并增加索引
# 测试例子
print_decimal_by_recursion(12345)
```
这两种方法都会从低位开始,逐位输出一个十进制数。
阅读全文