首页 > 试题广场 >

报数

[编程题]报数
  • 热度指数:3116 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
今年7月份vivo迎来了新入职的大学生,现在需要为每个新同事分配一个工号。人力资源部同事小v设计了一个方法为每个人进行排序并分配最终的工号,具体规则是:
将N(N<10000)个人排成一排,从第1个人开始报数;如果报数是M的倍数就出列,报到队尾后则回到队头继续报,直到所有人都出列;
最后按照出列顺序为每个人依次分配工号。请你使用自己擅长的编程语言帮助小v实现此方法。


输入描述:
输入2个正整数,空格分隔,第一个代表人数N,第二个代表M:


输出描述:
输出一个int数组,每个数据表示原来在队列中的位置用空格隔开,表示出列顺序:
示例1

输入

6 3

输出

3 6 4 2 5 1

说明

6个人排成一排,原始位置编号即为1-6。最终输出3 6 4 2 5 1表示的是原来编号为3的第一个出列,编号为1的最后一个出列。
def solution(N,M):
    
    li = list(map(int, range(1, N + 1)))
    sub = li
    k = 0
    while sub:
        li = []
        for i in range(len(sub)):
            k += 1
            if k % M == 0:
                print(sub[i], end=' ')  # 满足条件就输出
            else:
                li.append(sub[i])  # 不满足就加进新的列表
        sub = li  # 最后将新的列表赋值,再进行循环
    pass

N,M = [int(i) for i in input().split()]
solution(N,M)

发表于 2020-12-09 16:37:15 回复(0)
n,m = map(int,input().split())
p = [i+1 for i in range(n)] 
count,idx = 1,0
while p:
    idx %= len(p)
    if count%m ==0:
        print(p[idx],end=' ')
        p.remove(p[idx])
        count +=1
        continue
    count +=1
    idx +=1

发表于 2020-08-12 12:04:01 回复(0)
def solution(N,M):
    if N < 1&nbs***bsp;M < 1:
        return 
    a = [i for i in range(1,N+1)]
    count = 1
    res = []
    while a:
        temp = []
        for i in a:
            if count%M != 0:
                temp.append(i)
            else:
                res.append(i)
            count += 1
        a = temp
    print(" ".join(map(str,res)))
    return
N,M = [int(i) for i in input().split()]
solution(N,M)

发表于 2020-03-07 15:15:21 回复(0)