题目:n个数字形成一个圆圈,从0开始,每次从这个圆圈删除第m个数字(第一个为当前数字,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除的数字的下一个数字继续删除第m个数字。求出这个圆圈中剩下的最后一个数字。
第一种思路:
假设数组为[0,1,2,3,4,5,6,7],m值为3,则最后一个数字为6
#include<iostream>
using namespace std;
int main()
{
int m,flag=0;
cin>>m;//输入要删除数字的m值
int a[8]={0,1,2,3,4,5,6,7};
for(int length=8;length>0;--length)
{
if(length==1)//如果数组长度为1,则输出并终止循环
{
cout<<a[0];
break;
}
for(int i=(flag+m-1)%length;i!=length;++i)//每次删除一个元素后,把删除数字后面的元素向前移动一位
{
a[i]=a[i+1];
}
flag=(flag+m-1)%length;
}
return 0;
}
第一种思路使用了两次for循环,时间复杂度为O(n*m/2)
第二种思路:
参考lzj509649444的专栏关于此题的讲解导出公示
f(n,m)=(f(n-1,m)+m)%n ,n>1
代码
#include<iostream>
using namespace std;
int main()
{
int m,flag=0;
cin>>m;
int a[8]={0,1,2,3,4,5,6,7};
int last=0;
for(int i=2;i<=8;++i)
last=(last+m)%i;
cout<<last<<endl;
return 0;
}
1万+

被折叠的 条评论
为什么被折叠?



