初学者定时器线程程序回答一个谜语
本文关键字:一个 谜语 定时器 线程 程序 初学者 | 更新日期: 2023-09-27 17:50:55
所以我试图通过写一个程序来回答我的朋友在面试中遇到的问题:"在两秒的时间标记处,一只蚊子开始每秒钟产卵另一只蚊子。从t = 0时的一只蚊子开始,8.5秒后会有多少只蚊子?"
public class ok
{
public static int num;
public static void mosquito()
{
Task.Delay(1000);
System.Timers.Timer aTimer = new System.Timers.Timer();
aTimer.Elapsed += OnTimedEvent;
aTimer.Interval = 1000;
aTimer.Enabled = true;
}
// Specify what you want to happen when the Elapsed event is raised.
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
num++;
ThreadStart mos = mosquito;
}
}
public static void Main()
{
ok.mosquito();
SendWithDelay();
Console.WriteLine("Press a key to exit");
Console.ReadKey();
}
// Prints mosquito count after 8.5 seconds
private static async Task SendWithDelay()
{
await Task.Delay(8500);
Console.WriteLine(ok.num);
}
这是我试图写的简单代码,但显然失败了。我试着阅读任务API并以更好的方式理解发生了什么,我知道我需要确保访问变量"num",它跟踪蚊子计数是线程安全的,但我对此相当生锈。
帮助将是非常感激的。谢谢!
把问题转过来,所有出生两秒的蚊子都会产生另一只蚊子,所以我们需要一点历史记录,让我们使用一个数组:
int[9] mosquitoHistory;
从计时器开始让事情变得复杂,假设事情每秒发生一次,让我们使用循环。
for (i = 0, i++, i < 9)
{
如果我们能得到2s前的蚊子数量
int matureMosquitos = (seconds-2 >= 0 ? mosquitoHistory[seconds-2] : 0);
写出这一秒蚊子的数量,即我们上一秒有多少蚊子加上成熟蚊子的数量。
mosquitoHistory[seconds] = (seconds-1 >= 0 ? mosquitoHistory[seconds-1] : 1) + matureMosquitos;
并输出结果
Console.WriteLine(mosquitoHistory[seconds]);
最后,如果你想让它模拟睡一秒钟:
Threading.Thread.Sleep(1000);
把它们放在一起,这就是你得到的。
using System;
public class Program
{
public static void Main()
{
int[] mosquitoHistory = new int[9];
for (int seconds = 0; seconds < 9; seconds++)
{
int matureMosquitos = (seconds-2 >= 0 ? mosquitoHistory[seconds-2] : 0);
mosquitoHistory[seconds] = (seconds-1 >= 0 ? mosquitoHistory[seconds-1] : 1) + matureMosquitos;
Console.WriteLine(mosquitoHistory[seconds]);
Threading.Thread.Sleep(1000);
}
}
}
我得到34只蚊子
这是一个简单的离散2^n
算法。
2s mark we have 1 + 1 = 2
3s mark we have 1 + 1 + 2 = 4
4s mark we have 1 + 1 + 2 + 4 = 8
5s mark we have 1 + 1 + 2 + 4 + 8 = 16
等。
代码示例
var numMosqito = 1;
for (float time = 0; time <= 8.5; time ++)
{
if (time >= 2)
numMosqito += numMosqito;
Console.WriteLine("{0}, {1}", time, numMosqito);
}
Console.ReadLine();