{
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)的语句就会发生溢出(因为程序访问了为定义的内存空间)所以就会退出循环
满意么
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)