嗨,我想生成在Python或C ++中仅包含0和9的数字 我这样写:
for i in range(0,100):
random_number = 9 * 10**i
for j in range(0,i):
second_sum = 9 *10 ** j
random_number += second_sum
print(random_number)
但是这样输出
9
99
999
9999
99999
999999
9999999
99999999
999999999
9999999999
............
..............
但是预期输出是
9
90
99
900
909
990
999
9000
9009
9090
9099
9900
9990
9999
--snip--
任何人都可以帮助我:)
答案 0 :(得分:6)
根据@ B.Go的评论,以下是替换方法的解决方案:
def generate(n=5):
for i in range(1, 2**n):
yield int('{:b}'.format(i).replace('1', '9'))
print([*generate(5)])
打印:
[9, 90, 99, 900, 909, 990, 999, 9000, 9009, 9090, 9099, 9900, 9909, 9990, 9999, 90000, 90009, 90090, 90099, 90900, 90909, 90990, 90999, 99000, 99009, 99090, 99099, 99900, 99909, 99990, 99999]
答案 1 :(得分:4)
(已编辑)
您的方法无效,因为:
random_number
。for i in range(0, 3):
random_number = 9 * 10 ** i
print(random_number) # <--- HERE
for j in range(0, i):
second_sum = 9 * 10 ** j
random_number += second_sum
print(random_number) # <--- HERE
# 9
# 90
# 99
# 900
# 909
# 999
990
丢失了,这种方法不易推广,因为它需要任意数量的嵌套循环。
还有其他几种可能的方法,要么基于itertools.product
(作为无穷生成器,它更通用且更易于扩展),或者观察到自然数的二进制表示非常接近目标输出:
import itertools
def my_gen_itertools(max_len=0, items='09'):
length = 1
while max_len and length <= max_len:
for x in itertools.product(items, repeat=length):
if x[0] != items[0]:
yield int(''.join(x))
length += 1
def my_gen_bin_mult(n, factor=9):
for i in range(1, 2 ** n):
yield int(bin(i)[2:]) * factor
def my_gen_bin_replace(n, subst='9'):
for i in range(1, 2 ** n):
yield int('{:b}'.format(i).replace('1', subst))
def my_gen_bit_mult(n, factor=9):
k = [10 ** i for i in range(n)]
for value in range(1, 2 ** n):
result = 0
j = 0
while value:
result += (value & 1) * k[j]
value >>= 1
j += 1
yield result * factor
请注意,my_gen_bin_replace()
本质上是@AndrejKesely's answer中提出的解决方案,除了它使用更高效的bin()
调用来获取二进制表示形式,同时使用my_gen_bin_replace()
和{{ 1}}是@Orace's answer中提出的方法的实现。
my_gen_bin_mult()
与my_gen_bit_mult()
相似,不同之处在于它不使用中间字符串表示来处理,但是使用了相当昂贵的计算能力和Python直接循环,但它最容易转换到C ++(直接循环不会那么慢)。
在速度方面,将二进制表示形式相乘似乎是最快的:
my_gen_bin_mult()
答案 2 :(得分:2)
您只需要一个循环,在i
中说[0..100]
,将i
转换为二进制表示形式(仅0和1),然后将1替换为9(如果有一个整数,您可以乘以9)。
这里有一种方法可以将任何整数转换为二进制表示的字符串,但字符串中要包含0而不是0-1。
n=int(input('please enter the no. in decimal format: '))
x=n
k=[]
while (n>0):
a=int(float(n%2))
k.append(a)
n=(n-a)/2
k.append(0)
string=""
for j in k[::-1]:
string=string+str(j*9)
print('The binary no. for %d is %s'%(x, string))
答案 3 :(得分:2)
它不是性能最好的版本,可以根据您的需要进行改进,但这可能是解决方案的主意。
#!/usr/bin/env python3
def with_digits(n):
assert(n > 0)
if n == 1:
return [0, 9]
prevs = with_digits(n-1)
values = [] + prevs
for prev in prevs:
values.append(9 * 10 ** (n-1) + prev)
return values
if __name__ == '__main__':
print(with_digits(5))