目录
【问题描述】
现有26名同学(使用‘A’~‘Z’进行标记)围坐一圈。从键盘输入一个正整数k(1<=k<=10),现在从标记为‘A’的同学开始报数如果所报数字能够被k整除,则该同学退出圈中,剩余同学重新开始游戏。报数的规则如下:
1)每一次开始游戏均从1开始报数;
2)每一名同学所报数字为前一个同学所报数字加1。
请按照同学出圈的顺序输出其标记。
【输入形式】
1个正整数。
【输出形式】
26个字母构成的字符串。
【样例输入】
8
【样例输出】
HPXFOYISCNAMBRGWTLKQVEDUJZ
思路简述
类似用Eratosthenes算法(筛选法)求1~100间的素数。用一个一维数组a存放2,3,4,......100;从a[0]开始,将其后是a[0]倍数的元素值置为0,其他依次类推。最后,数组a中不为0的元素均为素数。
#include<iostream>
#include<iomanip>
using namespace std;
const int arrSize=100;
void prime(int a[ ],int n);
int main( )
{
int a[arrSize],i,count;
for(i=0;i<arrSize;i++) //产生数组
a[i]=i+1;
prime (a,arrSize); //求素数
cout<<"1~100之间的素数为:"<<endl;
for(i=0,count=0;i<arrSize;i++) //输出素数
{
if(a[i]!=0)
{
cout<<setw(5)<<a[i];
count++;
if(count%10==0) //输出10个数后换行
cout<<endl;
}
}
cout<<endl;
return 0;
}
void prime(int a[ ],int n)
{
int i,j;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(a[i]!=0 && a[j]!=0 && a[j]%a[i]==0)
a[j]=0;
}
我们用一个一维数组来存放1~26个数,当其在游戏中出圈,我们将他置为0;以后进行游戏时为0的不参与报数。
#include<iostream>
using namespace std;
int main()
{
int k=0,temp=0,set=0;
cin>>k;
int arr[26]={0};
for(int i=0;i<26;i++){
arr[i]=i+1;
}
do{ //循环嵌套,实现转圈
for(int i=0;i<26;i++){
if(arr[i]!=0){
temp++; //报数
}
if(temp==k){
cout<<char(i+65); //<<i+'A'cout
arr[i]=0;//出圈元素变零
temp=0;
//有元素出圈就赋0 重新开始游戏
set++;//元素出圈的个数
}
if(set==26){
return 0; //全部出圈后结束
}
}
}while(1);
}
总结
此题我认为最关键的是如何实现转圈的效果(循环)!
写一个无条件的循环,当全为0后就退出循环。