假设在一堆硬币中混杂着一枚假币,而且已知假币比真币重。假币问题研究的是如何用一架天平将假硬币找出来。现给定31枚硬币,其中有一枚假币,采用二分的思路,最多需要称( )次可以找出假币。
时间: 2024-03-15 17:42:52 浏览: 98
采用二分的思路,最多需要称 4 次可以找出假币。
首先将硬币分成两堆,一堆放 10 枚,另一堆放 21 枚。然后将这两堆硬币分别放在天平的两端,比较它们的重量。如果两堆重量相等,说明假币在剩下的那一堆中。这样就排除了一半的硬币。
接下来,将剩下的 21 枚硬币分成两堆,一堆放 10 枚,另一堆放 11 枚。同样地,将它们分别放在天平的两端,比较它们的重量。如果两堆重量相等,说明假币在剩下的那一堆中。这样又排除了一半的硬币。
接下来,将剩下的 11 枚硬币分成两堆,一堆放 5 枚,另一堆放 6 枚。同样地,将它们分别放在天平的两端,比较它们的重量。如果两堆重量相等,说明假币在剩下的那一堆中。这样又排除了一半的硬币。
最后,将剩下的 6 枚硬币分成两堆,一堆放 3 枚,另一堆放 3 枚。同样地,将它们分别放在天平的两端,比较它们的重量。如果两堆重量相等,说明剩下的一枚硬币就是假币;否则,假币就在天平较重的那一端。
相关问题
假设有120个硬币,其中有一枚假币,且已知假币比真币重。现有一台天平,请设计一个算法,怎么在最坏情况下用最少次数找出假币。写出寻找过程。
可以采用二分法的思想,将120个硬币分成两组,分别放在天平的两端。如果天平平衡,则说明假币在剩余的60枚硬币中,否则假币在天平较重的一端。
接下来,将天平较重的一端的60枚硬币再分成两组,放在天平的两端进行比较。如果天平平衡,则说明假币在剩余的30枚硬币中,否则假币在天平较重的一端。
重复以上步骤,每次都将硬币数量减半,直到最后只剩下一枚硬币,此时这枚硬币就是假币。
在最坏情况下,假币恰好在最后一次比较时被找出,因此需要进行7次比较。
寻找过程如下:
1. 将120枚硬币分成两组,放在天平两端进行比较。
2. 如果天平平衡,则假币在剩余的60枚硬币中,否则假币在天平较重的一端。
3. 将天平较重的一端的60枚硬币分成两组,放在天平两端进行比较。
4. 如果天平平衡,则假币在剩余的30枚硬币中,否则假币在天平较重的一端。
5. 将天平较重的一端的30枚硬币分成两组,放在天平两端进行比较。
6. 如果天平平衡,则假币在剩余的15枚硬币中,否则假币在天平较重的一端。
7. 将天平较重的一端的15枚硬币分成两组,放在天平两端进行比较。
8. 如果天平平衡,则假币在剩余的7枚硬币中,否则假币在天平较重的一端。
9. 将天平较重的一端的7枚硬币分成两组,放在天平两端进行比较。
10. 如果天平平衡,则假币在剩余的3枚硬币中,否则假币在天平较重的一端。
11. 将天平较重的一端的3枚硬币分成两组,放在天平两端进行比较。
12. 如果天平平衡,则假币在剩余的1枚硬币中,否则假币就是天平较重的那枚硬币。
用c语言编写为一个代码 1、在放硬币中,有一枚是假币,并且已知假币比真币轻。通过一架天平来任意比较两组硬币,设计一个高效的算法来测出这枚假币。 1、分别用二分法和三分法解决问题。 2、 输入:n(硬币数量)(随机初始化n枚假币的重量)
在C语言中,我们可以通过二分查找法和三分查找法来解决这个问题。这里先解释下基本思路:
**二分法(Binary Search Algorithm):**
1. 将n枚硬币分成两半,每边各放一半。
2. 称量两边的重量,如果平衡,则假币在未称的那一半里;如果不平衡,假币在较轻的那一边。
3. 对找到的一半再进行二分查找,直至找出假币。
**伪代码(二分法):**
```c
function findFakeCoin(binarySearch, coins, n):
if n == 1: // 如果只有一个硬币,直接判断重量
return coins[0] < trueWeight ? 0 : n
mid = n / 2;
left = binarySearch(coins, mid);
right = n - 1 - left;
if (coins[mid] < coins[right]):
return findFakeCoin(binarySearch, coins, mid);
else:
return findFakeCoin(binarySearch, coins, right + 1);
```
**三分法(Three-way Split Algorithm):**
1. 将硬币分为三等份,称量其中两份,假币会在较轻的那一堆或中间堆中。
2. 如果两堆相等,则假币在剩下的那一堆里;如果不等,假币在较轻的那堆或中间堆。
3. 分别对找到的两部分继续三分法查找。
**伪代码(三分法):**
```c
function findFakeCoin(trinarySearch, coins, n):
if n <= 3: // 递归基础条件,小到可以直接比较重量
for i in range(n):
if coins[i] < trueWeight:
return i;
return -1; // 没有找到假币
mid = n / 3;
left = trinarySearch(coins, 0, mid);
middle = mid + 1;
right = n - 1;
if (coins[left] < coins[middle]) and (coins[middle] >= coins[right]):
return left;
elif (coins[left] >= coins[middle]) and (coins[middle] < coins[right]):
return middle;
else: // 假币在右部或中部
return trinarySearch(coins, middle, right);
```
**相关问题--:**
1. 这两种方法的时间复杂度分别是多少?
2. 当硬币数量非常大时,如何优化这种算法?
3. 如何处理输入的随机初始化情况,保证找到假币的概率均匀分布?
阅读全文