今天看到一题 java 的题目,# 输出 4 位数中能被 3 整除不能被 6 整除的数,两个数字一行,三个数字一行交替输出。
想试试如何用 python 实现,鄙人 python 初学者,还望各位指点一下
1
ClutchBear 2018-08-05 01:17:26 +08:00
```python
flag = 0 for i in range(1002, 9999 + 1, 3): if i % 6 != 0: print(i, end=" ") flag += 1 if flag == 2: print() if flag == 5: print() flag = 0 ``` |
2
ryd994 2018-08-05 02:15:13 +08:00 via Android 1
直接 5 个数一个单位循环不就行了
而且这样的数出现的周期就是 6,去掉不输出的那个,刚好 5 个输出 |
3
gaohongyuan 2018-08-05 02:57:37 +08:00
@ClutchBear
直接 range(1005, 10000, 6)就行吧,就不用判断是否被 6 整除了 |
4
Laccuse OP @ClutchBear 我把你的代码跑了一下,不知道是不是我的格式问题,输出的只是那些数字,并没有按要求分行输出。看下去虽说能理解,但是本人对 flag 函数不是很熟悉,望指点。
还有我的方法求满足要求的整数是: i_d = [i for i in range(1000, 10000) if i % 3 == 0 and i % 6 != 0] 这个列表我想再遍历输出的话就有点不知道怎么下手了 @ryd994 如果是五个数一个单位,那么是否会五个五个地输出呢,这似乎和题目不太符合啊- -。题目要求的是单数行输出两个数,双数行的输出三个数 |
5
ryd994 2018-08-05 10:48:02 +08:00 via Android
你中间加一个换行不就行了?
我说的是 5 个数一个循环单元 |
6
yb3712590 2018-08-05 10:57:20 +08:00
from itertools import zip_longest
numbers = [str(i) for i in range(1002, 10000, 3) if i%3 ==0 and i%6 != 0] groups = ['%s %s%s%s %s %s'%(i[0], i[1],'\n' if i[2] else '', i[2], i[3], i[4]) for i in zip_longest(*[iter(numbers)]*5,fillvalue='')] print('\n'.join(groups)) |
7
eastrd 2018-08-05 11:33:41 +08:00 via Android
先拿到所有数字,然后分配到两个线程中进行交叉输出+睡眠+循环。
|
8
ClutchBear 2018-08-05 16:18:39 +08:00
|
9
SilverBullet 2018-08-05 17:17:33 +08:00
用 numpy 非常简单。
```python import numpy as np data = np.arange(1000,10000) data = data[(data%3 == 0) * (data%6 != 0)].reshape(-1, 5) [print('{} {}\n{} {} {}'.format(*row)) for row in data] ``` |
10
THsoul 2018-08-05 17:45:20 +08:00
获取到 4 位数中能被 3 整除不能被 6 整除的数
list = filter(None, [i if(i%3 is 0 and i%6 is not 0) else None for i in range(1000, 10000)]) 写一个返回指定长度并从元列表中剔除这些元素的方法 def push_num(list, reqlen): count = 0 req = [] while count is not reqlen: req.append(list[0]) del list[0] count += 1 return req 再写一个交替判断 def list_slice(list): req = [] req.append(push_num(list, 2)) while True: if len(list) is 0: return req if len(req[-1]) is 3: req.append(push_num(list, 2)) elif len(req[-1]) is 2: req.append(push_num(list, 3)) 最后 结合一下 list_slice( filter(None, [i if(i%3 is 0 and i%6 is not 0) else None for i in range(1000, 10000)]) ) |
11
wwg1994 2018-08-05 21:16:05 +08:00
2 楼完美解决,doge
|
12
twor 2018-08-05 21:19:54 +08:00
@Laccuse 1L 的就蛮好的,语法简单,代码也不长。
flag 就是一个变量,用于输出 2、3 间隔的,非常简单,不要想复杂了 |
13
Laccuse OP @ryd994 那我大概懂你的意思了,受你的启发我做了一个和你想的有点出入的,谢谢指教
i_d = [i for i in range(1000, 10000) if i % 3 == 0 and i % 6 != 0] for j in range(len(i_d)): print(i_d[j], end=' ') if (j+4) % 5 == 0 or (j-4) % 5 == 0: print('') @yb3712590 厉害,只是我还没学到 itertool 里面的 zip_longest,有机会再继续研究吧,谢谢 @eastrd 多线程现在还在摸索,看下来方法挺多的,也是思路一种,谢谢大佬指教 @ClutchBear - -看了你的图是我傻逼了,真不知道当时是怎么复制进去修正格式的,谢谢,现在可以了 @SilverBullet 百度了下似乎挺好用的一个包,我回头再研究下,谢谢 @THsoul 辛苦了,写得很详细,只是现在对你的那个 None 不理解 @twor 已经回头看了,可能是我对那些陌生的变量接触得比较少吧,我还傻乎乎地去查 flag 了,还以为是插旗了哈哈,谢谢指点 @wwg1994 看来我理解还不够啊哈哈 |