#include<stdio.h>
#define N 50 //定义数组的最大长度 下面输入的n应该小于这个长度
void main()
{
int i,k,m,n,num[N],*p;
printf("请输入总人数:");
scanf("%d",&n);
p=num;//指针指向数组
for(i=0;i<n;i++)
*(p+i)=i+1;//利用循环为数组中的每个元素赋编号1-n
i=0;//控制指针移动
k=0;//报数器1-3
m=0;//退出人数计数
while(m<n-1)
{
if(*(p+i)!=0)//开始报数 只要编号不等于0报数器1
k++;
if(k==3)//报数到3时
{
*(p+i)=0;//将该人的编号置为0,表示该人已经退出
k=0;//报数器清零
m++;//退出人数加1
}
i++;//指针移动
if(i==n)//如果遇到最后一个n则从第一个开始
i=0;
}
while(*p==0)//检索编号不是0的人 即最后留下的人
p++;
printf("编号为%d的学员最后留下来了\n",*p);
}
运行下。。。。。。。。。。。输入10个 输出编号是 4的留下
/*链表做法*/
#include<stdio.h>
#include<malloc.h>
typedef struct node{
int info;
struct node *next;
};
node *tbuildhlink(int n) /*带头节点的尾插法*/
{
node *head,*s,*p2;
int i=1;
head=(node *)malloc(sizeof(node));
p2=head;
while(i<=n)
{
s=(node *)malloc(sizeof(node));
s->info=i;
p2->next=s;
p2=s;
i++;
}
if(p2) p2->next=head;
return(head);
}
void Display(struct node* head)
{
node *p;
p=head->next;
if(!p)
{
printf("\nthe hlink is empty!");
}
else
{
printf("\nthe value of the hlink is:\n");
while(p!=head)
{
printf("%d--->",p->info);
p=p->next;
}
}
printf("^\n");
}
int delete_node(struct node *head,int n,int m)
{
int count=1,sum=n;
struct node *p,*pre;
pre=head;
p=pre->next;
while(sum>1)
{
if(p==head)
{
p=p->next;
}
if(count<m)
{
pre=p;
p=p->next;
count++;
}
if(count==m)
{
if(p==head)
{
p=p->next;
}
//printf("第%d个人出列.\n",p->info);
pre->next=p->next;
free(p);
p=pre->next;
count=1;
sum--;
}
}
return(pre->info);
}
int main()
{
struct node* head;
int n,m;
printf("输入n m:");
scanf("%d%d",&n,&m);
head=tbuildhlink(n);
Display(head);
printf("最后剩下第%d个.\n",delete_node(head,n,m));
return(0);
}
/*约瑟夫问题*/
#include"stdio.h"
#define N 100
#define M 3
main()
{
int i,a[N+1],m,cur_m=1,n=N;
for(i=1;i<=N;i++)
a[i]=i;
while(1)
{
if(n==1) {
printf("\n%d 号留下\n",a[1]);
break;}
m=(cur_m+M-1)%n;
m==0?cur_m=n:cur_m=m;
printf("%d ",a[cur_m]);
if(m==0) cur_m=1;
else for(i=m;i<n;i++)
a[i]=a[i+1];
n--;
}
}
一
长整数的处理。假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,则实际的长整数m表示为:
m=a[k]×10k-1+a[k-1]×10k-2+….+a[2]×10+a[1]
其中a[0]保存该长整数的位数。求:
(1) 长整数乘普通整数;
(2) 长整数除普通整数。
二 用C语言为学生宿舍管理人员编写一个宿舍管理软件。设某宿舍有:101,102,201,202四个房间,每个房间可住学生<=4人,链表存储结构:学号、姓名、房间号、后续指针,按房间号有序,实现学生的入住、退房和查询,按给定学号、姓名、房号查询。
三
小学生数学测试软件的编写,要求:
(1) 可选择题型(+,-,*);
(2) 可选择每次答题的个数;
(3) 每次输入答案后应判断对错,若答案错误,应给出正确答案;
(4) 最后给出做对题目的总个数。
四
约瑟夫生者死者游戏:30个旅客同乘一条船,因为严重超载,非常危险,大家一致同意将一半的旅客投入海中。30个旅客围成一圈,由第一个人开始,依次报数,数到第9人,便把他投入大海中,然后从他的下一个人数起,数到第9人,再将他投入大海,如此循环,直到剩下15个乘客为止。问哪些位置是将被扔下大海的位置。试用数组和单循环链表来解决本问题,并比较两种数据结构在问题求解中的难易程度。
一
长整数的处理。假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,则实际的长整数m表示为:
m=a[k]×10k-1+a[k-1]×10k-2+….+a[2]×10+a[1]
其中a[0]保存该长整数的位数。求:
(1) 长整数乘普通整数;
(2) 长整数除普通整数。
二 用C语言为学生宿舍管理人员编写一个宿舍管理软件。设某宿舍有:101,102,201,202四个房间,每个房间可住学生<=4人,链表存储结构:学号、姓名、房间号、后续指针,按房间号有序,实现学生的入住、退房和查询,按给定学号、姓名、房号查询。
三
小学生数学测试软件的编写,要求:
(1) 可选择题型(+,-,*);
(2) 可选择每次答题的个数;
(3) 每次输入答案后应判断对错,若答案错误,应给出正确答案;
(4) 最后给出做对题目的总个数。
四
约瑟夫生者死者游戏:30个旅客同乘一条船,因为严重超载,非常危险,大家一致同意将一半的旅客投入海中。30个旅客围成一圈,由第一个人开始,依次报数,数到第9人,便把他投入大海中,然后从他的下一个人数起,数到第9人,再将他投入大海,如此循环,直到剩下15个乘客为止。问哪些位置是将被扔下大海的位置。试用数组和单循环链表来解决本问题,并比较两种数据结构在问题求解中的难易程度。
bang wo xia