实验2 芯片测试算法设计

一、【实验目的】

(1)理解分治策略的设计思想;

(2)熟悉将伪码转换为可运行的程序的方法;

(3)能够根据算法的要求设计具体的实例。

二、【实验内容】

   有n片芯片,其中好芯片比坏芯片至少多1片,现需要通过测试从中找出1片好芯片。测试方法是:将2片芯片放到测试台上,2片芯片互相测试并报告测试结果:“好”或者“坏”。假设好芯片的报告是正确的,坏芯片的报告是不可靠的。请设计一个算法,使用最少的测试次数来找出1片好芯片。

提示:可参考教材P29页的算法2.3. 测试函数可以采用以下方法。

#include "stdio.h"

#include <stdlib.h>

#include <time.h>

//建立测试函数,参数iA表示主动测试芯片, iB表示被测芯片.返回值为被测芯片的测试值

//值为1时表示好芯片,为0时表示坏芯片.

//应用随机数来表示不确定的值1、0.注意:在主函数中加上随机数种子语句srand(time(NULL));

//算法的输入可以用数组表示,比如:ABc[17]={1,0,0,1,1,1,0,0,1,1,1,1,0,1,0,0,0} 表示17个芯片,其中9片好芯片、8片坏芯片。

int X_test(int iA,int iB)

{

              if(iA==1)

                            return iB;

              return rand()%2; 

}

三、实验源代码

#include "stdio.h"
#include <stdlib.h>
#include <time.h>
#define n 17
int X_test(int iA,int iB)
{if(iA==1)return iB;return rand()%2; 
}void print_arr(int arr[],int arr_size){ //打印数组 int i;for(i=0;i<arr_size;i++){printf("%d ",arr[i]);}printf("\n");
}int get_chip(int arr[],int start,int arr_size){ //获取没被丢弃的芯片坐标 int i = start % arr_size;while(arr[i] != 1){i++;i = i % arr_size; }return i;
}int get_chips_num(int arr[],int arr_size){ //获取剩余的芯片数 int i;int cnt = 0;for(i = 0;i < arr_size;i++){if(arr[i] == 1){cnt++;}}printf("chips_num = %d\n",cnt);return cnt;
}int main(){int i;int k = n;int chips[n] = {1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0};int chip1;int chip2;int result1;int result2;int a[n];for(i=0;i<n;i++){ //保存芯片丢弃情况,1表示未丢弃 a[i] = 1;}srand(time(NULL));get_chips_num(a,n);chip1 = get_chip(a,0,n);chip2 = get_chip(a,chip1 + 1,n);while(k>3){for(i=0;i<k/2;i++){chip1 = get_chip(a,chip2 + 1,n);chip2 = get_chip(a,chip1 + 1,n);result1 = X_test(chips[chip1],chips[chip2]);result2 = X_test(chips[chip2],chips[chip1]);if(result1 == 1 && result2 == 1){a[chip1] = 0; //设为0表示丢弃 }else{a[chip1] = 0;a[chip2] = 0;}print_arr(a,n);if(get_chips_num(a,n) <= 3) break;}k = get_chips_num(a,n);}if(k = 3){chip1 = get_chip(a,0,n);chip2 = get_chip(a,chip1 + 1,n);result1 = X_test(chips[chip1],chips[chip2]);result2 = X_test(chips[chip2],chips[chip1]);if(result1 == 0 || result2 == 0){a[chip1] = 0;a[chip2] = 0;printf("ans = %d",get_chip(a,0,n));			}else{printf("ans = %d",chip1);}		}if(k < 3){chip1 = get_chip(a,0,n);printf("ans = %d",chip1);		}return 0;
}

四、实验结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/747397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

并发编程之 sleep 与 yield的详细解析

3.7 sleep 与 yield sleep 调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态&#xff08;阻塞&#xff09; 其它线程可以使用 interrupt 方法打断正在睡眠的线程&#xff0c;这时 sleep 方法会抛出 InterruptedException public static void main(String[] args) …

基于单片机的简单温控风扇设计与实现

基于单片机的简单温控风扇设计与实现 摘要&#xff1a; 随着智能家居的兴起&#xff0c;温控设备在日常生活中扮演着越来越重要的角色。本文设计并实现了一款基于单片机的简单温控风扇系统。该系统能够根据环境温度自动调整风扇转速&#xff0c;为用户提供更加舒适的使用体验。…

Spring Boot整合canal实现数据一致性解决方案解析-部署+实战

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1.前言 2.canal部署安装 3.Spring Boot整合canal 3.1数据库与缓存一致性问题…

嵌入式驱动学习第三周——如何优化驱动及提高驱动稳定性

前言 在 Linux 中应用程序运行在用户空间&#xff0c;应用程序错误之后&#xff0c;并不会影响其他程序的运行&#xff0c;而驱动工作在内核层&#xff0c;是内核代码的一部分&#xff0c;当驱动出现问题之后&#xff0c;可能会导致整个系统的崩溃。所以在驱动中&#xff0c;需…

【CSP考题扩展】前缀和/差分练习

【深进1.例1 求区间和】 题目描述 给定 n n n 个正整数组成的数列 a 1 , a 2 , ⋯ , a n a_1, a_2, \cdots, a_n a1​,a2​,⋯,an​ 和 m m m 个区间 [ l i , r i ] [l_i,r_i] [li​,ri​]&#xff0c;分别求这 m m m 个区间的区间和。 对于所有测试数据&#xff0c; n…

MySQL锁机制

概述 作为一名程序员(我是java开发)&#xff0c;锁是一个绕不开的话题。有读锁、写锁、排他锁、共享锁、红锁、可重入锁、自旋锁、公平锁、乐观锁、分段锁、偏向锁等等&#xff08;其实有些是一个意思&#xff09;。今天这里要说的是Mysql的锁机制(主要是innodb)&#xff0c;涉…

excel导入功能(适用于vue和react都可)

如图所示&#xff08;需求&#xff09;&#xff1a;点击导入excel后&#xff0c;数据自动新增到列表数据内 这里以vue3 andt 为例 template 标签内代码 &#xff1a; <a-uploadname"file":multiple"true":show-upload-list"false":customR…

3.3 ss-sp寄存器,栈的push和pop指令

汇编语言 1. 栈 栈是一种具有特殊的访问方式的存储空间它的特殊性就在于&#xff0c;最后进入这个空间的数据&#xff0c;最先出去。即先进后出 1.1 栈的基本操作 入栈&#xff1a;入栈就是将一个新的元素放到栈顶出栈&#xff1a;出栈就是从栈顶取出一个元素栈顶的元素总是…

C++ 智能指针的正确使用方式:unique_ptr VS shared_ptr

在实际的使用过程中&#xff0c;很多人都会有这样的问题&#xff1a; 不知道智能指针的具体使用场景无脑只使用 shared_ptr认为应该禁用 raw pointer(裸指针&#xff0c;即 Widget * 这种形式)&#xff0c;全部使用智能指针 本文将从这几方面讲解智能指针&#xff1a; 智能指…

Docker简单认识

目录 一、Docker概述 二、容器技术 2.1 容器与虚拟机的比较 2.2 容器和应用程序的比较 三、Docker和容器的关系 四、Docker和操作系统 五、总结 一、Docker概述 Docker 是一个开源的平台&#xff0c;用于开发、运送和运行应用程序。通过使应用程序与底层系统隔离&#x…

过滤器Filter和数组的filter()方法

在使用vue中的过滤器中的时候忽然想到数组中的fiter()方法&#xff0c;不禁想总结一下两者的用法和实现。 过滤器 在 Vue.js 中&#xff0c;过滤器是用于在模板中对数据进行格式化的一种机制。过滤器通过管道符 | 连接到表达式&#xff0c;例如&#xff1a; {{ message | filt…

服务雪崩,熔断,降级,限流之理解

服务雪崩是现状。 通过限流&#xff0c;熔断&#xff0c;降级等方式可以处理雪崩的问题。 服务限流&#xff0c;主要是为了保护服务的正常运行&#xff0c;大量请求过来&#xff0c;忙不过来&#xff0c;起码服务还能用。 服务熔断&#xff0c;是因为大量请求大多数失败或者…

机器学习常用框架

机器学习是人工智能的一个重要分支&#xff0c;它通过让计算机系统利用数据自我学习来改进任务执行的能力。在机器学习领域&#xff0c;有许多成熟的框架被广泛使用&#xff0c;这些框架提供了构建和训练机器学习模型的工具。以下是一些常用的机器学习框架&#xff1a; Tensor…

第2章 信息技术基础

本章学习要点 全面了解医院信息系统建设所涉及的主要信息技术以及这些技术的应用情况。 计算机与网络、信息技术与信息系统、数字媒体与数据存储技术、条形码(二维码)、RFID技术、云计算、APP技术 1.XML 可扩展标记语言与Access&#xff0c;Oracle和SQL Server等数据库不同…

【机器学习-01】机器学习基本概念与建模流程

机器学习的过程本质上是一个不断通过数据训练来提升模型在对应评估指标上表现的过程。在此过程中&#xff0c;为模型提供有效的反馈并基于这些反馈进行持续的调整是至关重要的。只有当这个过程顺利进行时&#xff0c;模型才能得到有效的训练&#xff0c;机器才能真正实现学习。…

修改vscode中代码的注释颜色

打开C盘、进入user目录&#xff0c;然后依次打开以下图片中的文件夹&#xff0c;在指定的文件中进行修改。 1. 2. 3. 4. 5. 6.

2049.不容易系列之(4)——考新郎

2048的升级 当nm时则全排错&#xff0c;与上题一样 当n>m时&#xff0c;则有n-m个是排对的&#xff0c;剩下m个全错 import java.util.*;public class Main {public static void main(String[] args) {Scanner scannernew Scanner(System.in);int num scanner.nextInt()…

解决ubuntu 22.04新内核6.5.0-15无法编译NVIDIA显卡驱动

这里的新内核应该包括6.5.*系列的 文章目录 遇到的问题&#xff1a; 遇到的问题&#xff1a; 今天我在安装NVIDIA显卡驱动发现了一个问题&#xff0c;主要日志如下所示&#xff1a; make[3]: *** [scripts/Makefile.build:251: /tmp/selfgz1310041/NVIDIA-Linux-x86_64-550.5…

昂贵的日用品和廉价的奢侈品

不同消费支出的心理账户之间具有非替代性 不同的消费支出分置在不同的心理账户中&#xff0c;不同消费心理账户的开支会受到所在账户预算约束的影响。 心理账户的预算控制机制 人们在分配总预算时&#xff0c;会将预算分门别类地分配到具体的心理账户中去。对于所有超过心理账…

【Docker】apisix 容器化部署

APISIX环境标准软件基于Bitnami apisix 构建。当前版本为3.8.0 你可以通过轻云UC部署工具直接安装部署&#xff0c;也可以手动按如下文档操作&#xff0c;该项目已经全面开源&#xff0c;可以从如下环境获取 配置文件地址: https://gitee.com/qingplus/qingcloud-platform qi…