找假币问题头歌作业

def f_c(a, arr):  # a为索引,l列表,最终函数运行结果是假币的位置索引和假币的重量。

    x = len(arr)  # x继承个数

    # print(a+1, arr) #打印索引和列表,报告检查

    if x == 1:  # 单列表

        return a  # ,返回序列

    if x % 2 == 1:  # 奇数长案例

        x = x - 1  # x继承尾序列,随便拿了最后一个

        y = 1  # 状态变量随便抽一个

    else:  # 偶数长

        y = 0  # 直接分

        # 以上为第一批选择结构

        # 分割

    if (sum(arr[:x // 2])) < sum(arr[x // 2:x]):  # 前半段 小于 后半段

        return f_c(a, arr[:x // 2])  # 递归调用 ,前半段再分

    elif (sum(arr[:x // 2])) > sum(arr[x // 2:x]):  # 前大于后

        return f_c(a + x // 2, arr[x // 2:x])  # 递归后半段

    else:  # ,上面应该是控制了补集关系,前后相等.

        if y == 0:  # 平分状态

            return -1  # 返回负一,无假币

        else:  # 随便拿了最后一个

            if arr[x] < arr[0]:  # 鉴定为假

                return a + x  # 返回序列

            else:  # equal

                return -1  # 无假币

if __name__ == '__main__':

    li = input().split(',')  # get char

    a = [int(x) for x in li]  # be int

    n = f_c(0, a)  # get it x

    if n!=-1:

        print('position is: %d, weight is: %d.' % (n, a[n]))

    else:

        print('position is: %d, weight is: %d.' % (n, -1))

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分治法是一种解决问题的思想,通过将问题分解成更小的部分,逐步解决这些部分来解决整个问题。对于假币问题,可以将硬币分成两堆,并比较两堆硬币的重量。 以下是C语言代码示例: ```c #include <stdio.h> // 定义假币重量 #define FAKE_COIN_WEIGHT 10 // 使用分治法假币 int findFakeCoin(int coins[], int start, int end) { // 如果只有一枚硬币 if (start == end) { // 判断是否是假币 if (coins[start] == FAKE_COIN_WEIGHT) { return start; } else { return -1; // 没有假币 } } // 硬币总数为偶数,分成两等份 int middle = (start + end) / 2; int leftSum = 0, rightSum = 0; // 计算左边硬币重量总和 for (int i = start; i <= middle; i++) { leftSum += coins[i]; } // 计算右边硬币重量总和 for (int i = middle + 1; i <= end; i++) { rightSum += coins[i]; } // 如果左右两边总和不相等,则继续分治 if (leftSum != rightSum) { // 左边总和大于右边,假币在左边 if (leftSum > rightSum) { return findFakeCoin(coins, start, middle); } else { // 右边总和大于左边,假币在右边 return findFakeCoin(coins, middle + 1, end); } } else { return -1; // 没有假币 } } int main() { int coins[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10}; // 假币重量为10 int numCoins = sizeof(coins) / sizeof(coins[0]); int fakeCoinIndex = findFakeCoin(coins, 0, numCoins - 1); if (fakeCoinIndex != -1) { printf("到了假币,索引为:%d\n", fakeCoinIndex); } else { printf("没有假币\n"); } return 0; } ``` 上述代码中,通过分治法将硬币分成两等份,并计算左右两边硬币的重量总和。如果左右两边总和不相等,则继续分治,直到假币或确定没有假币。最终输出假币的索引或提示没有假币
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值