你的问题和下面类似,这是C++的笔试题,你可以参考下:
143、有一个数组a[1000]存放0--1000;要求每隔二个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。
以7个数为例:
{0,1,2,3,4,5,6,7} 0-->1-->2(删除)-->3-->4-->5(删除)-->6-->7-->0(删除),如此循环直到最后一个数被删除。
方法1:数组
#include
usingnamespace std;
#definenull 1000
intmain()
{
intarr[1000];
for (inti=0;i<1000;++i)
arr[i]=i;
int j=0;
intcount=0;
while(count<999)
{
while(arr[j%1000]==null)
j=(++j)%1000;
j=(++j)%1000;
while(arr[j%1000]==null)
j=(++j)%1000;
j=(++j)%1000;
while(arr[j%1000]==null)
j=(++j)%1000;
arr[j]=null;
++count;
}
while(arr[j]==null)
j=(++j)%1000;
cout<
}
方法2:链表
#include
using namespace std;
#define null 0
struct node
{
int data;
node* next;
};
int main()
{
node* head=new node;
head->data=0;
head->next=null;
node* p=head;
for(inti=1;i<1000;i++)
{
node* tmp=new node;
tmp->data=i;
tmp->next=null;
head->next=tmp;
head=head->next;
}
head->next=p;
while(p!=p->next)
{
p->next->next=p->next->next->next;
p=p->next->next;
}
cout<
return0;
}
方法3:通用算法
#include
#defineMAXLINE 1000 //元素个数
/*
MAXLINE 元素个数
a[] 元素数组
R[] 指针场
suffix 下标
index 返回最后的下标序号
values 返回最后的下标对应的值
start 从第几个开始
K 间隔
*/
int find_n(int a[],int R[],int K,int& index,int& values,int s=0) {
int suffix;
int front_node,current_node;
suffix=0;
if(s==0) {
current_node=0;
front_node=MAXLINE-1;
}
else {
current_node=s;
front_node=s-1;
}
while(R[front_node]!=front_node) {
printf("%d\n",a[current_node]);
R[front_node]=R[current_node];
if(K==1) {
current_node=R[front_node];
continue;
}
for(int i=0;i
}
current_node=R[front_node];
}
index=front_node;
values=a[front_node];
return 0;
}
int main(void) {
int a[MAXLINE],R[MAXLINE],suffix,index,values,start,i,K;
suffix=index=values=start=0;
K=2;
for(i=0;i
R[i]=i+1;
}
R[i-1]=0;
find_n(a,R,K,index,values,2);
printf("thevalue is %d,%d\n",index,values);
return0;
}
有用请采纳,谢谢!
函数定义和实现需要加上返回值类型:void josephus(int n,int s,int m);
如果问题解决,请采纳!
#include
#include
typedef struct jo
{
int num;
struct jo *next;
}jo;
void josephus(int n,int s,int m);
int main()
{
int n,s,m;
printf("请输入n,s,m\n");
scanf("%d%d%d",&n,&s,&m);
josephus(n,s,m);
return 0;
}
void josephus(int n,int s,int m)
{
int i,j;
jo *begin=NULL,*temp=NULL,*end=NULL;
for(i=n;i>0;i--)
{
temp=(jo *)malloc(sizeof jo);
temp->num=i;
if(i==n)
end=temp;
else
temp->next=begin;
begin=temp;
}
end->next=begin;
for(i=0;i
begin=begin->next;
}
for(i=0;i
for(j=0;j
begin=begin->next;
if(j==m-2)
temp=begin;
}
printf("第%d人出列\n",begin->num);
temp->next=begin->next;
}
}