| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 793 人关注过本帖
标题:求给出算法问题出自哪里
只看楼主 加入收藏
wengbin
Rank: 10Rank: 10Rank: 10
来 自:陕西西安
等 级:贵宾
威 望:19
帖 子:370
专家分:1846
注 册:2015-5-8
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
求给出算法问题出自哪里
// LampNN.cpp : 定义控制台应用程序的入口点。
/*N盏灯,N个人,各自从0开始编号,灯编号为人编号的数时,那个人能拉那个灯,
如第一个人能拉所有的灯,第二个能拉编号为2,4,6,8,10....依次类推,现给出N,求N个人过后亮着灯的个数*/
//

#include "stdafx.h"
#include "iostream"

using namespace std;

bool countCan(int, int);
bool LightOn(int);    //函数声明

int main()                //主函数入口
{
    int N = 0;    //初始化参数,N为灯的数量
    cout << "enter the amount of lamp:\n";
    cin >> N;
    int i = 0;    //第i个人
    int j = 0;    //第j个灯
    int countSum = 0;//总计数器
    int countSingle = 0;
    for (j = 1; j <= N; j++)
    {
        for (i = 1; i <= N; i++)
        {
            if (countCan(j, i))
                countSingle++;        //第j盏灯能被拉时,countSingle自动加1
        }
        if (LightOn(countSingle))    //N个人过后如果灯是亮的则计数器加1
            countSum++;
    }
    cout << countSum;            //输出亮着的灯的数量
    return 0;
}

bool countCan(int j, int i)        //函数功能:判断第i个人能否拉第j盏灯
{
    if (j % i == 0)                //灯号与人号是倍数关系则可拉灯
        return true;
    else
        return false;
    return 0;
}
bool LightOn(int m)//判断被拉过m次后灯的亮与灭
{
    if (m % 2 == 0)
        return false;//被拉偶数次不亮
    else
        return true;
    return 0;

}
 //现在的问题在于,程序可以正常跑,但结果是借的,求大神指问题出在哪里
搜索更多相关主题的帖子: 应用程序 include amount 控制台 应用程序 include amount 控制台 
2015-05-22 19:09
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:0 
/*N盏灯,N个人,各自从0开始编号,灯编号为人编号的数时,那个人能拉那个灯,如第一个人能拉所有的灯,第二个能拉编号为2,4,6,8,10....依次类推现给出N,求N个人过后亮着灯的个数*/
能解释一下吗

一片落叶掉进了回忆的流年。
2015-05-22 20:26
wengbin
Rank: 10Rank: 10Rank: 10
来 自:陕西西安
等 级:贵宾
威 望:19
帖 子:370
专家分:1846
注 册:2015-5-8
收藏
得分:0 
回复 2楼 诸葛欧阳
哦哦,就是人从0到N开始编号,灯也是从0到N开始编号。走廊里有N个灯,每个人依次进去,灯编号是自己编号倍数时可以且一定要拉那个灯,N个人都进去一次,问最后有几个灯能是亮的
2015-05-22 21:02
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
应该不是从0开始编号吧,如果是从0编号,0的倍数都是0,编号为0的不就只拉编号为0这一盏灯?

能编个毛线衣吗?
2015-05-22 21:57
wengbin
Rank: 10Rank: 10Rank: 10
来 自:陕西西安
等 级:贵宾
威 望:19
帖 子:370
专家分:1846
注 册:2015-5-8
收藏
得分:0 
回复 4楼 wmf2014
从一开始编号的,我写错了,程序里是没错的,i和j都是从一开始的
2015-05-22 22:23
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:10 
for (j = 1; j <= N; j++){
      countSingle=0;
      for (i = 1; i <= N; i++){
            if (countCan(j, i))
                countSingle++;        //第j盏灯能被拉时,countSingle自动加1
      }
        if (LightOn(countSingle))    //N个人过后如果灯是亮的则计数器加1
            countSum++;
  }

剑栈风樯各苦辛,别时冰雪到时春
2015-05-22 22:35
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:10 
用数组可能简单些,代码如下:
程序代码:
#include "stdafx.h"
#include "iostream"
using namespace std;
void main()
{
    int i,j,s,n;
    char *p;
    cout << "enter the amount of lamp:\n";
    cin>>n;
    p=new char[n];
    for(i=0;i<n;i++)p[i]=0;  //所有灯关闭
    for(i=1;i<n+1;i++)
    {
        for(j=i;j<n+1;j+=i)p[j-1]=p[j-1]^1;
        cout<<""<<i<<"次:";
        for(s=0;s<n;s++)if(p[s])cout<<s+1<<",";;
        cout<<endl;
    }
    for(i=0,s=0;i<n;i++)if(p[i])s++;;
    cout<<"共有"<<s<<"盏灯亮"<<endl;
    delete p;
}


能编个毛线衣吗?
2015-05-22 22:46
wengbin
Rank: 10Rank: 10Rank: 10
来 自:陕西西安
等 级:贵宾
威 望:19
帖 子:370
专家分:1846
注 册:2015-5-8
收藏
得分:0 
回复 6楼 林月儿
拜谢
2015-05-22 22:52
wengbin
Rank: 10Rank: 10Rank: 10
来 自:陕西西安
等 级:贵宾
威 望:19
帖 子:370
专家分:1846
注 册:2015-5-8
收藏
得分:0 
回复 7楼 wmf2014
感谢感谢,我会参考学习您的代码
2015-05-22 22:53
快速回复:求给出算法问题出自哪里
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015900 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved