找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 595|回复: 6

亮着电灯的盏数

[复制链接]

14

主题

65

回帖

0

积分

新手上路

积分
0
发表于 2013-7-1 23:12:09 | 显示全部楼层 |阅读模式
一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1、2、3、…n-1、n。每盏电灯由一个拉线开关控制。开始,电灯全部关着。有n个学生从长廊穿过。第一个学生把号码凡是1的倍数的电灯的开关拉一下;接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。n个学生按此规定走完后,长廊里电灯有几盏亮着。
接口说明
原型:
    int GetLightLampNum(int n);
输入参数:
    int n: 电灯/学生的数量
返回值:
    int: 亮着的电灯数量

14

主题

65

回帖

0

积分

新手上路

积分
0
 楼主| 发表于 2013-7-5 20:42:37 | 显示全部楼层
参考思路:单独考虑每一盏灯被拉的次数,得出最后状态,再求和。

210

主题

371

回帖

0

积分

管理员

积分
0
发表于 2013-7-7 22:11:29 | 显示全部楼层
好久没有过来做题了,不能荒废了,只要晚上有时间过就过做练习。
#define MAX 65536
int GetLightLampNum(int N)
{
    int i=0,j=1,light[MAX]={0},number=0;   
    while(j<=N)
    {
        for(i=1;i<=N;i++)
        {   
            if(i*j<=N)
                light[i*j-1]++;   
        }
        j++;
    }

    for(i=0;i<N;i++)
    {
        if(light%2!=0)
            number++;
    }
    return number;
}
我试着输入数值,当N大46341的时候为什么会打印出segmentation fault?

14

主题

65

回帖

0

积分

新手上路

积分
0
 楼主| 发表于 2013-7-7 23:34:44 | 显示全部楼层

回 tyrone2497谁 的帖子

tyrone2497谁:好久没有过来做题了,不能荒废了,只要晚上有时间过就过做练习。
#define MAX 65536
int GetLightLampNum(int N)
{
&#160;&#160;&#160;&#160;int i=0,j=1,light[MAX]={0},number=0;&#160;&#160;&#160;&#160;
.......&#160;(2013-07-07 22:11)&#160;
if(light%2!=0)
light是数组的地址吧?

14

主题

65

回帖

0

积分

新手上路

积分
0
 楼主| 发表于 2013-7-7 23:55:18 | 显示全部楼层
参考解法,效率较低,有优化的空间。
  1. int GetLightLampNum(int n)
  2. {
  3. &#160;&#160;&#160;&#160;int count = 0;  // 最终亮着的灯数
  4. &#160;&#160;&#160;&#160;int i = 0;
  5. &#160;&#160;&#160;&#160;int j = 0;
  6. &#160;&#160;&#160;&#160;int flag = 0;  // 灯的状态,0表示灭,1表示亮
  7. &#160;&#160;&#160;&#160;
  8. &#160;&#160;&#160;&#160;for (i = 1; i <= n; i++)
  9. &#160;&#160;&#160;&#160;{
  10. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;flag = 0;
  11. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
  12. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for (j = 1; j <= n; j++)
  13. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
  14. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if (0 == i % j)
  15. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
  16. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;flag = ~flag;
  17. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
  18. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
  19. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
  20. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if (flag)
  21. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
  22. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;count++;
  23. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
  24. &#160;&#160;&#160;&#160;}
  25. &#160;&#160;&#160;&#160;
  26. &#160;&#160;&#160;&#160;return count;
  27. }
复制代码

210

主题

371

回帖

0

积分

管理员

积分
0
发表于 2013-7-8 10:14:50 | 显示全部楼层

回 boyfaceone 的帖子

boyfaceone:if(light%2!=0)
light是数组的地址吧? (2013-07-07 23:34)
奇了怪了,我看了下我的源码,是按数组来的,怎么复制过来就只剩数组名了?

210

主题

371

回帖

0

积分

管理员

积分
0
发表于 2013-7-8 20:29:03 | 显示全部楼层
今天翻译FAQ的时候看到了用传递参数动态定义数组的方法,这里就可以应用了,light=(int *)malloc(N*sizeof(int));然后在函数返回的之前释放开辟的空间free(light);light=NULL;
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-1 15:10 , Processed in 0.067063 second(s), 20 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表