有关于数组的例题

有关于数组的例题
一、
宾馆里有一百个房间,从1-100编了号。第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是2的倍数的房间“相反处理”,第三个服务员把所有编号是3的倍数的房间作“相反处理”…,以后每个服务员都是如此。当第100个服务员来过后,哪几扇门是打开的。(所谓“相反处理”是:原来开着的门关上,原来关上的门打开。)
【分析】此题较简单,用a[1],a[2],…,a[n]表示编号为1,2,3,…,n的门是否开着。模拟这些操作即可。

#include<cstdio>
#include<cstring>
#define MAXN 100+10
int a[MAXN];
int main()
{
	int n,k,first=1;
	memset(a,0,sizeof(a));
              for (int i=1;i<=100;++i)
	     for (int j=1;j<=100;++j)
	        if (j%i==0) a[j]=!a[j];
for (int i=1;i<=100;++i)
      if (a[i])
      {
        	 if(first) first=0; 
                     else printf(" ");
               printf("%d",i);  
      }
printf("\n");
return 0;	
}

【说明】:
memset(a,0,sizeof(a))的作用是把数组a清零,它在cstring中定义。虽然也能用for循环完成相同的任务,但是用memset又方便又快捷。
二、
约瑟夫问题:N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人开始报数,数到M的人出圈;…输出依次出圈的人的编号。N,M由键盘输入。
【分析】
(1)由于对于每个人只有出圈和没有圈两种状态,因此可以用布尔型标志数组存储游戏过程中每个人的状态。不妨用true表示出圈,false 表示没有出圈。
(2)开始的时候,给标志数组赋初值为false,即全部在圈内。
(3)模拟报数游戏的过程,直到所有的人出圈为止。

#include<iostream>
using namespace std;
int n,m,s,f,t;
bool a[101];		//根据题意开出数组大小
int main()
{
    cin>>n>>m;		//共n人,报到m出圈
    cout<<endl;
    for (t=1;t<=n;++t) 
    a[t]=false;        
    f=0;  t=0;  s=0
    do
    {
      ++t;		//逐个枚举圈中的所有位置
      if (t==n+1) t=1;	//数组模拟环状,最后一个与第一个相连
      if (a[t]==false) ++s;	//第t个位置上有人则报数
      if (s==m) 		//当前报的数是m
      {
   	  s=0;		//计数器清零
           cout<<t<<" ";	//输出出圈人的编号
           a[t]=true;	   //此处的人已出圈,设置为空
           f++;	 	//出圈的人数增加一个
        }
     } while(f!=n);	      //直到所有的人都出圈为止
    return 0;
}

  

三、
输入一串字符,字符个数不超过100,且以“.”结束。 判断它们是否构成回文。
【分析】所谓回文指从左到右和从右到左读一串字符的值是一样的,如12321,ABCBA,AA等。先读入要判断的一串字符(放入数组letter中),并记住这串字符的长度,然后首尾字符比较,并不断向中间靠拢,就可以判断出是否为回文。

#include<iostream>
using namespace std;
int main()
{   
    char ch,letter[101];
    int i=0,;
    cin>>ch;
    while (ch!='.') 	//读入一个字符串以'.'号结束
    {
      ++i;
      letter[i]=ch;
      cin>>ch;
    }
    j=1;
    while ((j<i)&&(letter[j]==letter[i]))     //判断它是否是回文
    {
        --i; ++j;
    }
    if (j>=i) cout<<"Yes"<<endl;
    else   cout<<"No"<<endl;
    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值