解题思路:用bin()转变为2进制,分两种情况111000和1100111000110,前者增加一位1,后者从后数,遇到第一个01,变为10,并将遇到的1变道最后

注意事项:

参考代码:

def f(n):

    sn=bin(n)

    sn=sn[2:]

    listn=[int(i) for i in sn]

    count=0

    for i in range(len(listn)):

        count+=listn[i]

    #111000

    temp=0

    l=len(listn)

    for i in range(count):

        temp+=listn[i]

    if temp==count:

        listn=[0]*(l+1)

        listn[0]=1

        for i in range(l,l-count+1,-1):

            listn[i]=1

    else:

        t=0

        val=0

        for i in range(l-1,1,-1):

            if listn[i]==1:

                t+=1

                print(t)

            if listn[i]==1 and listn[i-1]==0:

                listn[i-1],listn[i]=1,0

                val=i

                break

        for i in range(l-1,l-t,-1):

            listn[i]=1

            print(i,"  ",listn[i])

        for i in range(l-t,val,-1):

            listn[i]=0


    binstr =''.join(str(i) for i in listn)

    value=int(binstr,2)

    print(value)

    print(bin(value))

    print(n,"  ",sn,count)


while 1:

    n=int(input())

    if n==0:

        break

    else:

        f(n)


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论