C语言 报数游戏

C语言 报数游戏,第1张

main()

{

int a[22]

int i,j

for(i=0i<21i++)a[i]=1

a[0]=0//这兄物厅样,a[]的下标就是编号

j=0

int f,s

int n

scanf("%d",&n)

for(i=1i++)

{

NA:

j++

if(j==22)j=1//j的值是1~21

if(a[j]==0)goto NA

if(i==n)

{

a[j]=0

printf("j=%d\n",j)

s=0

for(f=0f<22f++)

{

s+=a[f]

}

if(s==1)break

i=0

}

}

for(f=0f<22f++)

{

if(a[f]==1)

printf("%d\蚂基n"羡隐,f)

}

}

#include <iostream>纤败

#include <cstdio>

using namespace std

int bh(int m)

int main(void) {

int n,m,k

while(cin >> n >> m 旁凯>> k && n + m + k) {

int f = 0,p = 0,q = m

while(1) {

if(bh(m)) p++

if(p==k) {

break

}

if(!f) {

m+=2*(n-q)

f=1

}

else {

m+=2*(q-1)

f=0

}

}

cout<<m<<endl

}

return 0

}

int bh(int m) {

if(m%7 == 0) 毁启颤return 1//是7的倍数时,暗7。

while(m) {

if(m%10 == 7) { // 某位是7时,明7。

return 1

}

m/=10

}

return 0//既不含明7也不含暗7

}

给你的程序做两个记号:

#include

<stdio.h>

#define

MAX

50

void

main()

{

int

i,k=0,m=0,n,num[MAX],*p=num

printf("请输入总人数:")

scanf("%d",&n)

for

(i=0i<ni++)

{

*(p+i)=i+1

}

i=0

while

(m<n-1)

---------------------(1)

{

if

(*(p+i)!=0)

k++

if

(k==3)

{

*(p+i)=0

-----------------(3)

m++

k=0

}

i++

if

(i==n)

-----------------------(2)

i=0

}

while

(*p==0)

p++

printf("编号为%d的人为班长。\n",*p)

}

当n>50时,记号(1)的while循环并不会执行n-1次(可以验证,它只执行了50次),也就是说这时并不是通过判断条件

m<n-1

正常退出的

所以标记(2)的判断语渣改拆句永远都不会被执行(因为n>50,而循环只执行歼指50次,故i永远不会等于n)这样如枣退出循环后继续执行下面的语句时

,数组num[MAX]当然不会像n<50时那样变成

00000...010...0的形式,而是1

2

0

4

5

0

6

7

0...的形式

那样指针p永远指向num[0](即

*p

==

1)

所以你输出时结果永远是1

解释一下“为什么n>50时会非正常退出循环”:因为

n>50

时,循环执行50次后,再执行时,标记(3)的语句就会发生溢出(因为程序访问了为定义的内存空间)所以就会退出循环

满意么


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

原文地址: http://outofmemory.cn/yw/12506896.html

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

发表评论

登录后才能评论

评论列表(0条)

保存