资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

c语言函数报数问题 c语言函数常见问题

C语言,报数问题

这个问题是著名的Josephus排列,就是要用指针和链表才是正确的思路。不用指针就暂时放置这题。若有非指针解你完全可以采纳他,若没有用指针正确写的,请结贴。给你个用指针并且还用链表的代码参考以便你在未来学会指针后来阅读。

创新互联建站于2013年开始,先为茫崖等服务建站,茫崖等地企业,进行企业商务咨询服务。为茫崖企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

c语言 报数问题

方法一:(推荐)不受人数限制,因为采用的动态分配

#include stdio.h

#include malloc.h

/*********************************************************************

*以循环队列的数据结构实现

*时间复杂度T(n)

*采用循环队列数据结构,使得每次对数组的访问次数减少到最少

**********************************************************************/

int main(void)

{

//定义并初始化各种变量

int i=0,//控制变量

num=0,//人数

die=0,//报数值

front,//队头位置

rear,//队尾位置

temp=0;//中间变量

do

{

printf("\n请输入人数(输入小于0退出):");

scanf("%d",num);

printf("\n请输入报数值:");

scanf("%d",die);

int *cycle=(int *)malloc((num+1)*sizeof(int));//多申请一个空间,在循环过程中方便处理

//依次编号,一号元素为0,暂时闲置

for(i=0;i=num;i++)

{

cycle[i]=i;

}

//置队头和队尾的位置

front=1;

rear=num;

i=1;//报数器置1,开始报数

while(front!=rear)//当队列中元素不止一个时,循环

{

//备份出队数据

temp=(rear+1)%(num+1);//在位置rear后预留一个位置,以免有元素入队

cycle[temp]=cycle[front];

front=(front+1)%(num+1);//队头元素出队,队头位置加1

//如果出队的人报数符合条件

if(i==die)

{

i=1;//报数重新置1,开始报数

printf("%d出队\n",cycle[temp]);//显示出队的元素

}

//如果出队的人报数不符合条件

else

{

i++;//报数值增1

//队尾插入刚出队的元素

rear=(rear+1)%(num+1);

cycle[rear]=cycle[temp];

}

}

printf("幸存者是%d\n",cycle[front]);

free(cycle);

}while(num!=0);

return 0;

}

方法二:(按你的要求)

#include stdio.h

/*********************************************************************

*以纯粹的思维方法实现

*时间复杂度T(n)

*过程繁琐,而且也不容易理解

*********************************************************************/

void main(void)

{

int result(int *p,int n,int m);

int i=0,m=0,n=0;

int num[50];

int *p;

for(;;)

{

printf("输入人数和报数值:");

scanf("%d%d", n, m);

for(i = 0; i n; i++)

num[i] = i + 1;

p = num;

cout"The last one is NO."result(p,n,m)endl;

}

}

int result(int *p,int n,int m)

{

int i=0;

for(i=0;in;i++)

p[i]=i+1;

i=0; // i为每次循环时计数变量

int k=0; // k为按1,2,3...m报数时的计数变量

int die=0; // die为退出人数

while (dien-1) // 当退出人数比n-1少时(即未退出人数大于1时)执行循环体

{

if (p[i]!=0) k++; //如果编号为0,就不报数;如果编号不为0,报数加1

if (k==m) // 将退出的人的编号置为0

{

printf("%d退出\n",p[i]);

p[i]=0;

k=0;//重新开始报数

m++;//退出人数加1

}

i++;

if (i==n) i=0; // 报数到尾后,i恢复为0

}

while(*p==0) p++;

return *p;

}

C语言编程,报数问题!

#include stdio.h

int main()

{

int N,M,*a;

int i,j,position=1,total=0,chage;/*total出队的人数*/

printf("Enter the N and M\n");

scanf("%d%d",N,M);

a=(int *)malloc(N*sizeof(int));

for (i=0;iN;i++)

a[i]=i+1;

while(1)

{

position+=M-1;

while (positionN-total)

position=position-N+total;

chage=a[position-1];

for (j=position;jN-total;j++)

a[j-1]=a[j];

a[N-total-1]=chage;

total++;

if (total==N)/*出队人数等于N,程序结束*/

{

for (i=0;iN-1;i++)

printf("%d-",a[N-i-1]);

printf("%d\n",a[0]);

return 0;

}

}

}

c语言函数题:报数

#include

#include

#define n 200

void tian(int(*p)[n])

{

int i, j;

int mn=p[n-1][n-1];

for (i=0; imn; ++i)

{

for (j=0; jmn; ++j)

{

if ((i+j==mn-1))

{

p[i][j]=1;

continue;

}

if ((i+jmn-1))

{

p[i][j]=2;

continue;

}

if ((i+jmn-1))

{

p[i][j]=3;

continue;

}

}

}

}

int main()

{

int a[n][n];

int i, j;

int len;

scanf("%d", len);

a[n-1][n-1]=len;

tian(a);

for (i=0; ilen; ++i)

{

for (j=0; jlen; ++j)

printf("%2d", a[i][j]);

printf("\n");

}

return 0;

}


当前题目:c语言函数报数问题 c语言函数常见问题
URL分享:http://www.cdkjz.cn/article/hghdps.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220