数到k出圈

目录

【问题描述】

思路简述

总结


【问题描述】

现有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后就退出循环。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欧帝想飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值