如何生成仅包含0和9的数字

时间:2019-12-07 20:39:04

标签: c++ python-3.x algorithm loops generator

嗨,我想生成在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--

任何人都可以帮助我:)

4 个答案:

答案 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))