开灯问题

简单的利用数组解决的有趣的小题目
数组的应用范围很广泛,是一种很方便使用的数据结构,但是同时,数组也有他的弊端,如两个数组不能够进行赋值操作,只能一个个元素的复制,且数组在声明时必须有确定的大小,在程序运行中不能再增加大小,但我们可以使用new来动态创建数组,也可以直接使用一些函数对数组进行操作,如复制函数memcpy(b,a,sizeof(type)*k)即将k个<span style="font-family: Arial, Helvetica, sans-serif;">type类型的元素从a复制给b,和memset(a,x,sizeof(a)),将数组a的值置为x,这都是常用的函数,这些函数包含在<string.h>头文件中。特别值得注意的是,当形参是引用时,数组不能转换为指针,而是传递数组的引用本身。</span>

 
/*
 有n盏灯,编号为1~n。第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(关闭),第3个人

  按下所有编号为3的倍数的开关(关掉的灯将被打开,开着的灯将被关闭),依次类推,一共有k个人,

  问最后有哪些灯开着?输入n,k

  */
#include<iostream>
using namespace std;
int main()
{
  int  n,k;
  int *s;
  cout<<"input n: "<<endl;
  cin>>n;
  s=new int[n+1];
  //初始化数组或是memset(s,0,sizeof(s));
  for(int h=0;h<n+1;h++)
	  s[h]=0;
  cout<<"input k: "<<endl;
  cin>>k;  
  //进行操作 
 
        for(int j=1;j<=k;j++) 
	    for(int i=1;i<n+1;i++) 
		// if(i%j==0 && s[i]==0)s[i]=1; 
		// else if(i%j==0 && s[i]==1)s[i]=0;
	//两句合为一句
	if(i%j==0)s[i]=!s[i];
     cout<<"show the array: "<<endl;
 //for(int t=1;t<n+1;t++)
//	 cout<<s[t]<<'\t';
 for(int t=1;t<n+1;t++)
	 if(s[t]==1)cout<<t<<endl;
 cout<<endl;delete []s;return 0;}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值