C语言程序,关于银行排队的。在线等!

C语言程序,关于银行排队的。在线等!,第1张

#include<stdio.h>

#include<malloc.h>

#define N 10

int main(void)

{

int i,j,x,m,flag=1

char ch

m=N

char (*p)[10]=(char (*)[10])calloc(N,10*sizeof(char))

for(i=0i<10i++)

for(j=0j<10j++)

p[i][j]='\0'

printf("输入ID时不超过10位,第一位不能为'*'\n")

i=0

while(1)

{

while(i<m)

{

printf("请输入第%d名的ID:",i+1)

ch=getchar()

for(j=0j<10j++)

{

if(j==0&&ch=='*')

{

flag=0

break

}

if(ch=='\n')

break

p[i][j]=ch

ch=getchar()

}

if(flag==0)

break

i=i+1

}

if(flag==0)

break

m=m+N

p=(char (*)[10])realloc(p,m*10*sizeof(char))

for(x=ix<mx++)

for(j=0j<10j++)

p[x][j]='\0'

}

for(j=0j<ij++)

{

printf("第%d名:",j+1)

printf("%s\n",p[j])

}

free(p)

return 0

}

#include&ltstdio.h&gt

#define N 5//人数

void main()

{

int a[N]={0},i=0,out_n=0,call_n=0,*p

p=a

while(1){//循环报数

if(*p==0){//如果健在

if(out_n==(N-1))break//如果仅剩一人

call_n++//报数

call_n%=3//最大为3,到了3就从0开始

if(call_n==0){*p=1out_n++}//为0(即3)出局

}

p++if(p==a+N)p=a//循环转向下一人

}

printf("最后剩余者的编号是:%d\n",p+1-a)

}

扩展资料:

printf()函数是格式化输出函数,一般用于向标准输出设备按规定格式输出信息。在编写程序时经常会用到此函数。

函数的原型为:int printf(const char*format,...);函数返回值为整型。若成功则返回输出的字符数,输出出错则返回负值。

printf()函数的调用格式为:

printf("&lt;格式化字符串&gt",&lt参量表&gt);

其中格式化字符串包括两部分内容:一部分是正常字符;这些字符将按原样输出;另一部分是格式化规定字符,以"%"开始,后跟一个或几个规定字符,用来确定输出内容格式。

参量表是需要输出的一系列参数,其个数必须与格式化字符串所说明的输出参数个数一样多,各参数之间用","分开,且顺序一一对应,否则将会出现意想不到的错误。

规定符

%d十进制有符号整数

%u十进制无符号整数

%f浮点数

%s字符串

%c单个字符

%p指针的值

%e指数形式的浮点数

%x,%X无符号以十六进制表示的整数

%o无符号以八进制表示的整数

%g把输出的值按照%e或者%f类型中输出长度较小的方式输出

%p输出地址符

%lu 32位无符号整数

%llu 64位无符号整数

此题可用数学方法求解。

设有n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数  (用数学方法解的时候需要注意应当从0开始编号,因为取余会取到0解。)

实质是一个递推,n个人中最终留下来的序号与n-1个人中留下来的人的序号有一个递推关系式。

假设除去第k个人,则

0, 1, 2, 3, ..., k-2, k-1, k, ..., n-1          // 原始序列 (1)

0, 1, 2, 3, ..., k-2,      , k, ..., n-1      // 除去第k人,即除去序号为k-1的人   (2)

k, k+1, ..., n-1,    0,    1,        ..., k-2// 以序号k为起始,从k开始报0  (3)

0, 1,     ..., n-k-1, n-k, n-k+1, ..., n-2   // 作编号转换,此时队列为n-1人  (4)

变换后就完完全全成为了(n-1)个人报数的子问题,注意(1)式和(4)式,是同一个问题,不同的仅仅是人数。比较(4)和(3),不难看出,0+k=k, 1+k=k+1, ... ,(3)式中'0'后面的数字,((n-3)+k)%n=k-3,((n-2)+k)%n=k-2, 对于 (3)式中'0'前面的数字,由于比n小,也可看作(0+k)%n=k,  (1+k)%n=k+1,  故可得出规律:

设(3)中某一数为x' , (4)中对应的数为x,则有:x'=(x+k)%n.

设x为最终留下的人序号时,队列只剩下1人时,显然x=0此时可向前回溯至2人时x对应的序号,3人时x对应的序号……直至n人时x的序号,即为所求。

递归法表示如下:

#include <iostream>

using namespace std

const int m = 3

int main()

{

    int n,f=0

    cin >> n

    for (int i=2i<=ni++) 

    f=(f+m)%i

    cout <<f+1<<endl

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11295897.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-15
下一篇2023-05-15

发表评论

登录后才能评论

评论列表(0条)

    保存