第18 题:题目:n 个数字(0,1,…,n-1)形成一个圆圈,从数字0 开始,

本文探讨了在n个数字构成的圆圈中,按特定规律删除数字的问题。从数字0开始,每次删除第m个数字,直到只剩下一个数字。通过数组存储数据,每次删除后更新数组长度和元素位置,以求得最终剩余的数字。

第18 题:
题目:n 个数字(0,1,…,n-1)形成一个圆圈,从数字0 开始,
每次从这个圆圈中删除第m 个数字(第一个为当前数字本身,第二个为当前数字的下一个
数字)。
当一个数字删除后,从被删除数字的下一个继续删除第m 个数字。
求出在这个圆圈中剩下的最后一个数字。

 

使用数组来存储数据,记录数组长度,每次删除元素后,将其后面的元素前移,更新数据长度,

直到之后一个元素。

#include <iostream>
#include <vector>
#include <cassert>

using namespace std;

class Cycle
{
public:
	Cycle(int *arr, int length):data(arr), dataLength(length)
	{
	}

	void deleteDataAtIndex(int index)
	{
		assert(index < dataLength);
		if (index != dataLength - 1)
			memcpy(&data[index], &data[index + 1], sizeof(int) * (dataLength - index - 1));
	}

	void deleteDataFrom(int startIndex, int delta, int &nextIndex)
	{
		assert(startIndex >= 0);
		assert(startIndex < dataLength);

		int index = (startIndex + delta - 1) % dataLength;

		deleteDataAtIndex(index);

		nextIndex = (index % (dataLength - 1));

		dataLength--;
	}

	int getLength()
	{
		return dataLength;
	}

	int getDataAtIndex(int index)
	{
		assert(index < dataLength);

		return data[index];
	}

private:
	int *data;
	int dataLength;
};


int main(void)
{
	int data[] = {0,1,2,3,4,5};
	int length = 6;
	int delta = 4;

	Cycle cycle(data, length);

	int index = 0;
	while(cycle.getLength() > 1)
	{
		cycle.deleteDataFrom(index, delta, index);
	}

	//cout << cycle.getLength() << endl;

	cout << cycle.getDataAtIndex(0) << endl;


	system("pause");

	return 0;
}


 

6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 当前1 - 100项,共494项 第1页 Toggle Sidebar 7-73 n个小朋友分糖果 7-73 n个小朋友分糖果 分数 15 作者 庄波 单位 山东航空学院 为了培养小朋友们分享的意识,老师教小朋友做分糖果的游戏,把自己带的糖果分给其他小朋友。 首先,全班 n 个小朋友围成一个圆圈,按排列顺序依次给他们编号 1,2,…,n。然后,从 1 号小朋友开始,将自己的糖果平均分成三份(如果有多余的糖果则立即吃掉),自己保留一份,其余两份分别分给与他相邻的两个小朋友。接下来按照编号顺序,2 号,3 号,4 号,…,直到 n 号小朋友都这样做。 问经过一轮分糖果游戏,每个小朋友手上分别有多少个糖果? 输入格式: 第一行为小朋友人数 n,保证 3≤n≤30。 第二行为空格隔开的 n 个正整数,依次表示游戏开始时按编号从 1 到 n 的顺序每个小朋友手上的糖果数。 输出格式: 在一行中输出空格隔开的 n 个整数,依次表示游戏结束时按编号从 1 到 n 的顺序每个小朋友手上的糖果数。 输入样例: 3 3 3 3 输出样例: 3 2 1 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 栈限制 8192 KB C (gcc) Selection deleted 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #include<stdio.h> int main(){ int n; int a[30]; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&a[i]);} //第一个分糖果数量 a[0]=a[0]/3; a[n-1]+=a[0]; a[1]+=a[0]; //2到n-1的糖果数量 for(int i=1;i<n-1;i++){ a[i]=a[i]/3; a[i-1]+=a[i]; a[i+1]+=a[i]; } //最后个分糖果数量 a[n-1]=a[n-1]/3; a[n-2]+=a[n-1]; a[0]+=a[n-1]; printf(" "); printf("%d",a[i]); return 0; } 哪不对?
最新发布
10-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值