`
pengcc
  • 浏览: 33173 次
  • 性别: Icon_minigender_1
  • 来自: Mars
最近访客 更多访客>>
社区版块
存档分类
最新评论

八枚银币问题的C语言实现

阅读更多

 现有八枚银币a b c d e f g h,已知其中一枚是假币,其重量不同于真币,但不知是较轻或较重,如何使用天平以最少的比较次数,决定出哪枚是假币,并得知假币比真币较轻或较重。

解法

单就求假币的问题是不难,但问题限制使用最少的比较次数,所以我们不能以单纯的回圈比较来求解,我们可以使用决策树(decision tree),使用分析与树状图来协助求解。

一个简单的状况是这样的,我们比较a+b+c与d+e+f ,如果相等,则假币必是g或h,我们先比较g或h哪个较重,如果g较重,再与a比较(a是真币),如果g等于a,则g为真币,则h为假币,由于h比g轻而 g是真币,则h假币的重量比真币轻。

完整的比较决策树如下图所示:



 
为了方便使用回圈,使用号码0至7表示银币,程序可以让您输入假币重量,但您无法事先得知假币是哪一枚,程序可得知假币是哪一枚,且它比真币轻或重。

 

C语言实现

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
 
void compare(int[], int, int, int); 
void eightcoins(int[]); 
 
int main(void) { 
    int coins[8] = {0}; 
    int i; 

    srand(time(NULL)); 

    for(i = 0; i < 8; i++) 
        coins[i] = 10; 

    printf("\n输入假币重量(比10大或小):"); 
    scanf("%d", &i); 
    coins[rand() % 8] = i; 

    eightcoins(coins); 

    printf("\n\n列出所有钱币重量:"); 
    for(i = 0; i < 8; i++) 
        printf("%d ", coins[i]); 

    printf("\n"); 

    return 0; 
} 

void compare(int coins[], int i, int j, int k) { 
    if(coins[i] > coins[k]) 
        printf("\n假币 %d 较重", i+1); 
    else 
        printf("\n假币 %d 较轻", j+1); 
} 

void eightcoins(int coins[]) { 
    if(coins[0]+coins[1]+coins[2] == 
       coins[3]+coins[4]+coins[5]) { 
        if(coins[6] > coins[7]) 
            compare(coins, 6, 7, 0); 
        else 
            compare(coins, 7, 6, 0); 
    } 
    else if(coins[0]+coins[1]+coins[2] > 
            coins[3]+coins[4]+coins[5]) { 
        if(coins[0]+coins[3] == coins[1]+coins[4]) 
            compare(coins, 2, 5, 0); 
        else if(coins[0]+coins[3] > coins[1]+coins[4]) 
            compare(coins, 0, 4, 1); 
        if(coins[0]+coins[3] < coins[1]+coins[4]) 
            compare(coins, 1, 3, 0); 
    } 
    else if(coins[0]+coins[1]+coins[2] <
            coins[3]+coins[4]+coins[5]) { 
        if(coins[0]+coins[3] == coins[1]+coins[4]) 
            compare(coins, 5, 2, 0); 
        else if(coins[0]+coins[3] > coins[1]+coins[4]) 
            compare(coins, 3, 1, 0); 
        if(coins[0]+coins[3] < coins[1]+coins[4]) 
            compare(coins, 4, 0, 1); 
    } 
}

 

  • 大小: 26.2 KB
分享到:
评论

相关推荐

    C语言分治算法求解30枚银币中的某枚假币.zip

    C语言分治算法求解30枚银币中的某枚假币,简单而言,30枚银币中有1枚假币,该假币的重量比其他29枚银币的重量小1,先将30枚银币平分成两部分,各15枚,分别称重,重量小的那一半银币中必然包含假币,然后再分成两...

    经典算法全部用C语言实现

    以下算法均用C语言实现,代码可运行 老掉牙 河内塔 费式数列 巴斯卡三角形 三色棋 老鼠走迷官(一) 老鼠走迷官(二) 骑士走棋盘 八个皇后 八枚银币 生命游戏 字串核对 双色、三色河内塔 背包问题...

    C语言贪心算法求解最少硬币问题源程序.zip

    贪心算法求解最少硬币问题C语言程序,问题描述:给顾客找零钱时,收银处有1元,5角和1角硬币若干,如何用最少数量的硬币找够零钱? 算法思想:比如要找给顾客2元9角钱,首先计算1元最多可以有多少枚,即2枚,减去2元,还...

    减治法解八枚硬币问题

    这是我自己写的减治法解八枚硬币问题的程序,需要的同学可以看看

    用C语言实现的硬币小游戏

    一个由C语言实现的硬币小游戏,共81个硬币,其中一个是特殊的,分三次称量,取出特殊的那个,完全实现了随机分配和过程显示

    C语言经典算法大全.pdf

    八枚银币 生命游戏 字串核对 双色 三色河内塔 背包问题(Knapsack Problem) 数 运算 蒙地卡罗法求 PI Eratosthenes筛选求质数 超长整数运算(大数运算) 长 PI 最大公因数 最小公倍数 因式分解 完美数 ...

    Java和C语言实现各种经典算法(含代码图例)

    Java和C语言实现各种经典算法(含代码图例) 老掉牙 河内塔 费式数列 巴斯卡三角形 三色棋 老鼠走迷官(一) 老鼠走迷官(二) 骑士走棋盘 八个皇后 八枚银币 生命游戏 字串核对 双色、三色河内塔 背包...

    java编程实现求解八枚银币代码分享

    主要介绍了java编程实现求解八枚银币代码分享,具有一定参考价值,需要的朋友可以了解下。

    经典算法(C语言)包含51个经典算法的C语言实现

    9.八枚银币 15 10.生命游戏 17 11.字串核对 20 12.双色、三色河内塔 22 13.背包问题(Knapsack Problem) 26 14.蒙地卡罗法求 PI 31 15.Eratosthenes筛选求质数 32 16.超长整数运算(大数运算) 34 17.长 PI 36 18....

    经典算法 Java和C语言两种实现

    河内塔 费式数列 巴斯卡三角形 三色棋 老鼠走迷官(一) 老鼠走迷官(二) 骑士走棋盘 八个皇后 八枚银币 生命游戏 字串核对 双色、三色河内塔 背包问题(Knapsack Problem)

    c语言经典算法包括老掉牙,汉诺塔,三色旗

    八枚银币 生命游戏 字串核对 双色、三色河内塔 背包问题(Knapsack Problem) 数、运算 蒙地卡罗法求 PI Eratosthenes筛选求质数 超长整数运算(大数运算) 长 PI 最大公因数、最小公倍数、因式分解 完美...

    C语言经典算法大全

    八枚银币 生命游戏. 字串核对 背包问题(Knapsack Problem)...........… 蒙地卡罗法求 PI Eratosthenes 筛选求质数 超长整数运算(大数运算) 长PI 最大公因数、最小公倍数、因式分解 完美数 阿姆斯壮数 最大访客...

    C语言马里奥游戏

    用C语言实现的简单马里奥游戏,内含源码与素材。游戏主体与马里奥相似。

    八枚银币.zip

    算法是解决特定问题或执行特定任务的一系列步骤或规则的有序集合。在计算机科学中,算法通常用来指导计算机执行特定的任务或解决问题。良好设计的算法能够有效地解决问题,并且在给定的输入下能够产生正确的输出。 ...

    实验银币问题

    问题描述与实验目的: 在n个银币中有一个是不合格的,不合格的银币比合格银币要轻。 现用天平秤银币,找出不合格的银币,且在最坏情况下秤银币的次数最少。 输入 输入有若干行。每行上有一个整数n,表示银币个数,n...

    经典的50个C语言程序

    河内塔 费式数列 巴斯卡三角形 三色棋 老鼠走迷官(一) 老鼠走迷官(二) 骑士走棋盘 八个皇后 八枚银币 生命游戏 字串核对 双色、三色河内塔 背包问题(Knapsack Problem)

    银币问题(关于数论)

    在n个银币,只有一个银币是次品,怎么用最少的次数称出这个次品。

Global site tag (gtag.js) - Google Analytics