Python算法(求二叉树子节点的数目(递归),矩阵对角之和,选择法排序)

 

 1. 如上所示,由正整数1,2,3……组成了一颗特殊二叉树。我们已知这个二叉树的最后一个结点是n。现在的问题是,结点m所在的子树中一共包括多少个结点。

    比如,n = 12,m = 3那么上图中的结点13,14,15以及后面的结点都是不存在的,结点m所在子树中包括的结点有3,6,7,12,因此结点m的所在子树中共有4个结点。 

输入:

        输入数据包括多行,每行给出一组测试数据,包括两个整数m,n (1 <= m <= n <= 1000000000)。最后一组测试数据中包括两个0,表示输入的结束,这组数据不用处理。 

输出:

         对于每一组测试数据,输出一行,该行包含一个整数,给出结点m所在子树中包括的结点的数目 

样例输入:

        

3 7
142 6574
2 754
0 0

样例输出:

3
63
498
def tree_count(n, m):
    global sum
    if m <= n:
        sum += 1
        tree_count(n, m*2)
        tree_count(n, m*2+1)
    else:
        return
while(True):
    sum = 0
    m, n = map(int, input().split(' '))
    if n == 0 and m == 0:
        break
    tree_count(n, m)
    print(sum)

2.求一个3×3的整型矩阵对角线元素之和。

 输入

        从键盘上输入3×3的整型矩阵,要求输入3行,每行3个整数,每个数之间以空格分隔

输出

        对角线元素之和,行尾换行

list1 = []
list = []
sum = 0
for i in range(0,3):
    list1 = input().split(" ")
    list.append(list1)
for i in range(0,3):
    sum += int(list[i][i])
print(sum)

 3.从键盘上输入10个整数,按照从小到大的顺序对这10个数排序。

采用选择法进行排序。

        提示:

        

选择排序的基本思想是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。

基本思想:第1趟,在待排序记录r[1]~r[n]中选出最小的记录,将它与r[1]交换;第2趟,在待排序记录r[2]~r[n]中选出最小的记录,将它与r[2]交换;以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。

以下为简单选择排序的存储状态,其中大括号内为无序区,大括号外为有序序列:

初始序列:49 27 65 97 76 12 38 }

第1趟:12与49交换:12 { 27 65 97 76 49 38 }

第2趟:27不动 :12 27 { 65 97 76 49 38 }

第3趟:65与38交换:12 27 38 { 97 76 49 65 }

第4趟:97与49交换:12 27 38 49 { 76 97 65 }

第5趟:76与65交换:12 27 38 49 65 { 97 76 }

第6趟:97与76交换:12 27 38 49 65 76 97 完成

注意C语言数组的下标是从0开始的。

输入

         输入以空格分隔的10个整数

输出

        按从小到大排好序的10个数,每个数一行。

list = map(int, input().split(" "))
nums = []
for i in list:
    nums.append(i)
for i in range(0,len(nums)):
    for j in range(i, len(nums)):
        if(nums[i] > nums[j]):
            temp = nums[i]
            nums[i] = nums[j]
            nums[j] = temp
for each in nums:
    print(each)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值