先手获胜逻辑题_对于...下一个vs做...循环,获胜者是?

本文通过基准测试对比了For...Next循环与Do...Loop循环在执行固定次数迭代时的效率,发现For...Next循环明显更快,执行时间仅为Do...Loop的约51%。

先手获胜逻辑题

如果您要执行固定数量的迭代的代码段,请始终使用For ... Next循环而不是Do ... Loop,因为这样做明显更快。 每次循环执行Do ... Loop都会重复指定的次数,还要求您也实现或减少某种循环计数器,而For ... Next循环则可以为您工作。 这两个循环将提供相同的结果,但是For ... Next循环的速度明显更快。 值得一提的是,您不能总是用For ... Next替换Do ... Loop,如果循环迭代的数目是固定的,而不是基于在某些逻辑条件下。

我创建了一些简单的基准测试,涉及3个使用timeGetTime()API函数比较这两个循环的效率的试验。 还计算了两个过程的比较比率,使您可以更好地了解这两个比较。 我将在下面发布基准测试的代码。 如有任何疑问,请随时提问。


'Declaration needed for API Call
Public Declare Function timeGetTime Lib "winmm.dll" () As Long

Dim lngCounter As Long
Dim lngStart_1 As Long
Dim lngStart_2 As Long
Dim lngStop_1 As Long
Dim lngStop_2 As Long
Dim varTestVariable As Variant 
Const conNUM_OF_ITERATIONS As Long = 10000000 
'******************************* 1st up, For...Next *******************************
lngStart_1 = timeGetTime() 
  For lngCounter = 1 To conNUM_OF_ITERATIONS
    'do some processing here
    varTestVariable = (lngCounter / 0.25) * 1.5
  Next
lngStop_1 = timeGetTime() 
Debug.Print "For...Next took (" & FormatNumber((lngStop_1 - lngStart_1), 0) & _
            ") milliseconds to execute the expression"
'********************************************************************************** 
'******************************* 2nd up, Do...Loop ********************************
lngCounter = 1 
lngStart_2 = timeGetTime()
  Do Until lngCounter > conNUM_OF_ITERATIONS
    'same processing here as for the For...Next Loop
    varTestVariable = (lngCounter / 0.25) * 1.5
      lngCounter = lngCounter + 1
  Loop
lngStop_2 = timeGetTime() 
Debug.Print "Do...Loop took (" & FormatNumber((lngStop_2 - lngStart_2), 0) & _
            ") milliseconds to execute the expression"
'********************************************************************************** 
Debug.Print "The For...Next Loop executed the same code in [" & _
            Format((lngStop_1 - lngStart_1) / (lngStop_2 - lngStart_2), "Percent") & _
            "] of the time it took Do...Loop!"
输出:

For...Next took (766) milliseconds to execute the expression
Do...Loop took (1,515) milliseconds to execute the expression
The For...Next Loop executed the same code in [50.56%] of the time it took Do...Loop!  
For...Next took (781) milliseconds to execute the expression
Do...Loop took (1,516) milliseconds to execute the expression
The For...Next Loop executed the same code in [51.52%] of the time it took Do...Loop! 
For...Next took (781) milliseconds to execute the expression
Do...Loop took (1,532) milliseconds to execute the expression
The For...Next Loop executed the same code in [50.98%] of the time it took Do...Loop!
注意: Access 2002开发人员手册指出,For ... Next循环运行Do ... Loop进行比较代码的时间大约为45%。 根据以上列出的代码段,我的个人测试显示,根据3次试用的平均值,这个数字约为51.02%。

翻译自: https://bytes.com/topic/access/insights/797078-next-vs-do-loop-winner

先手获胜逻辑题

好的,让我们使用C++来解决Jerry和Tom的硬币游戏问。根据目描述,这实际上是一个典型的Nim游戏变种问,但因为盒子围成一圈,使得问稍微复杂一些。然而,由于每个玩家只能从固定的顺序取硬币,我们可以将其简化为线性结构来分析。 ### 目重述 Jerry和Tom正在进行一局游戏。他们准备了n个盒子,编号为1到n,其中i号盒子装有$a_i$枚硬币。他们将这n个盒子围成一圈,游戏规则如下: 1. Jerry和Tom轮流从某一个盒子中取走至少一枚硬币,Jerry先手从1号盒子开始取; 2. 如果前一个玩家取的是i号盒子中的硬币,那么当前玩家必须从i+1号盒子中取硬币。特别地,如果前一个玩家取的是n号盒子中的硬币,那么当前玩家必须从1号盒子中取硬币; 3. 如果轮到某位玩家时对应盒子中没有硬币,则该玩家失败。 假设Jerry和Tom都采取最优策略,请问谁会赢? #### 输入描述: - 第一行输入一个整数T ($1 \leq T \leq 100$)表示数据组数 - 对于每组测试数据,第一行输入一个整数n ($1 \leq n \leq 1000$)表示盒子的数量; - 第二行输入n个整数$a_i (1 \leq a_i \leq 10^9)$,分别表示1号到n号盒子中的硬币数量,整数之间以一个空格隔开。 #### 输出描述: - 输出T行,每行输出一个字符串,对于第i组测试数据,输出胜利者的名称(Jerry 或 Tom)。 ### 代码实现 我们将使用Nim游戏的理论来解决这个问。具体来说,我们将所有盒子中硬币的数量进行异或运算,根据异或和的结果来判断胜利者。 #### 完整C++代码 ```cpp #include <iostream> #include <vector> using namespace std; // 函数用于判断胜利者 string determineWinner(const vector<int>& coins) { int xor_sum = 0; for (int coin : coins) { xor_sum ^= coin; } return (xor_sum == 0) ? "Tom" : "Jerry"; } int main() { int T; cin >> T; while (T--) { int n; cin >> n; vector<int> coins(n); for (int i = 0; i < n; ++i) { cin >> coins[i]; } // 判断并输出胜利者 cout << determineWinner(coins) << endl; } return 0; } ``` ### 代码解析 1. **输入处理**: - 读取测试用例数量`T`,然后依次读取每组测试数据中的盒子数量`n`和每个盒子中的硬币数量。 2. **异或和计算**: - 对每个测试用例,计算所有盒子中硬币数目的异或和。根据Nim游戏理论,当所有堆的石子数目异或和为0时,先手必败;否则先手必胜。 3. **胜负判断**: - 如果异或和为0,则Tom获胜;否则Jerry获胜。 4. **输出结果**: - 按照目要求输出每组数据的胜利者。 ### 知识点 1. **Nim游戏**:一种两人轮流取物的游戏,通过异或运算判断胜负。 - 异或和为0时,先手必败;否则先手必胜。 2. **异或运算**:相同为0,不同为1,用于快速计算多个数字之间的关系。 - 在C++中使用`^`符号进行异或操作。 3. **函数设计与调用**:将胜负判断逻辑封装到函数`determineWinner`中,提高代码可读性和复用性。 希望这段代码能帮助你解决问。如果有任何问或需要进一步的帮助,请随时告诉我!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值