面试.NET工程师,有一道这样面试题:
代码题:对一批编号为1-100全部开关朝上(开)的灯进行以下操作:
开关编号凡是1的倍数反方向拨一次开关;若该编号也是2的倍数反方向又拨一次开关;若该编号又是3的倍数反方向又拨一次开关……以此类推一直计算到100为止。
计算出开关朝上(开)的灯的数量并给出代码
博主当时未加多思索(哈哈,拿出来做个对比,小伙伴们看看就好),便给出了以下答案:
class Program
{
static void Main(string[] args)
{
int sum = 0;
for (int i = 1; i <= 100; i++)
{
bool flag = true;//这代表开关朝上
for (int j = 1; j <= 100; j++)
{
if (i%j==0)
flag = false;
else
flag = true;
}
if (flag)//当第一个灯的100执行完成之后,flag为true代表开
sum++;
}
Console.WriteLine(sum);
Console.ReadKey();
}
}
然鹅,是错的,理想很丰满,现实很骨感,面试官还给我耐心讲解了以下,并提醒我要用数组来存储100盏灯,于是,我回来研究了,以下代码才是正确的:
class Program
{
static void Main(string[] args)
{
//假设0是朝上(开),1是朝下(关)
int[] light = new int[100];
for (int i = 0; i < 100; i++)
{
for (int n = 1; n < 101; n++)
{
if ((i + 1) % n == 0)
SetSwitch(light, i);
}
}
int sum = 0;
for (int i = 0; i < light.Length; i++)
{
if (light[i] == 0)
sum++;
}
Console.WriteLine(sum);//计算出sum=90
Console.ReadKey();
}
public static void SetSwitch(int[] temp, int i)
{
if (temp[i] == 0)
temp[i] = 1;
else if (temp[i] == 1)
temp[i] = 0;
}
}
其实,n可以直接从2开始,因为毕竟所有数都可以除以1,这里写出来方便阅读,实际设计中还是应该尽量避免冗余哦