有关于数组的例题
一、
宾馆里有一百个房间,从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;
}