开灯问题用C语言中的数组怎么解决?

问题:走廊里依次排列着100盏灯,依次从1号编100号,都关着,有100个学生依次从1号编到100号依次走来,1号学生从第一只开关按起,凡是1的倍数都按一下,2号学生从第二只开关按起,凡是2的倍数都按一下,3号学生从第三只开关按起,凡是3的倍数都按一下,依次类推,直到第100号学生按完为止,最后有多少只灯亮着,这个问题怎么解答

#include <stdio.h>

#define n 100

int main(int argc, const char * argv[])

{ int i,j;

int a[n]={0};

i=1;

j=1;

for (j=i;j<=n;j=j+i)

{

a[j]=!a[j];

}

for (i=0;i<n;i++) {

printf("%d",a[i]);

}

}
请问这段代码中有什么问题?

#include <stdio.h>
#define n 100
void main(void)
{
int i, j, a[n];

for(i = 0; i < n; i++) a[i] = 0;// 初始化为全0

for(i = 1; i <= n; i++)
for(j = i ; j <= n; j = j + i)
a[j - 1] += 1;

//100人对100灯,都操作完毕,下面是显示

for(i = 0; i < n; i++) {
if((i % 8) == 0) printf("\n");
printf(" L%2d: %d, ", i + 1, a[i] % 2);
}

printf("\n");
}
/*
运行结果显示如下:

L 1: 1, L 2: 0, L 3: 0, L 4: 1, L 5: 0, L 6: 0, L 7: 0, L 8: 0,
L 9: 1, L10: 0, L11: 0, L12: 0, L13: 0, L14: 0, L15: 0, L16: 1,
L17: 0, L18: 0, L19: 0, L20: 0, L21: 0, L22: 0, L23: 0, L24: 0,
L25: 1, L26: 0, L27: 0, L28: 0, L29: 0, L30: 0, L31: 0, L32: 0,
L33: 0, L34: 0, L35: 0, L36: 1, L37: 0, L38: 0, L39: 0, L40: 0,
L41: 0, L42: 0, L43: 0, L44: 0, L45: 0, L46: 0, L47: 0, L48: 0,
L49: 1, L50: 0, L51: 0, L52: 0, L53: 0, L54: 0, L55: 0, L56: 0,
L57: 0, L58: 0, L59: 0, L60: 0, L61: 0, L62: 0, L63: 0, L64: 1,
L65: 0, L66: 0, L67: 0, L68: 0, L69: 0, L70: 0, L71: 0, L72: 0,
L73: 0, L74: 0, L75: 0, L76: 0, L77: 0, L78: 0, L79: 0, L80: 0,
L81: 1, L82: 0, L83: 0, L84: 0, L85: 0, L86: 0, L87: 0, L88: 0,
L89: 0, L90: 0, L91: 0, L92: 0, L93: 0, L94: 0, L95: 0, L96: 0,
L97: 0, L98: 0, L99: 0, L100: 1,
Press any key to continue
*/
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-03-30
你这个只是一次循环而已,应该在外层嵌套一个循环,从1循环到100,表示这100个学生按灯,你的这个循环相当于是每个学生是怎么按灯的,是内层循环。
for(int k=1;k<=100;k++)

{
for (j=i;j<=n;j=j+i)

{

a[j]=!a[j];

}
}
这个样子就可以了,外层控制总的循环次数。本回答被提问者和网友采纳
第2个回答  推荐于2018-04-12
首先,你数组越界了,造成了你的for (j=i;j<=n;j=j+i)变成了死循环。应改为for (j=i;j<n;j=j+i)
其次,你的算法有问题,应该要for循环嵌套,你只有一个,结果肯定不对。
第3个回答  2014-12-10
#include <stdio.h>
#define NUM (100)
void main(void)
{
    unsigned char Light[NUM];
    unsigned char i,j;
    // 0 代表灭 1 代表亮
    // 首先关掉所有灯
    for(i = 0; i < NUM; i++)
    {
        Light[i] = 0;
    }
    // i 第几个学生
    for(i = 1; i <= NUM; i++)
    {
        // j 第几个灯
        for(j = i; j <= NUM; j = j+i)
        {
                Light[j-1] = (Light[j-1] == 0)?1:0;  // 按动开关
        }
    }
    // 显示
    for(i = 0; i < NUM; i++)
    {
        printf("%d ",Light[i]);
    }
}

第4个回答  2014-12-10
题目有问题吧,凡是1的倍数都按一下,1-100都是1的倍数啊
相似回答