#include
<stdio.h>
#include
<malloc.h>
#include
<memory.h>
//pLeft长度固定为N,
表示队伍中留下人的位置.nLeave是离开的人数,
判断结束
//输出是依次从队伍中离开的人的序号.
int
fun(unsigned
char
*pLeft,
int
N,
int
*nLeave,
int
m,
int
nStart)
{
int
nCount=0,nPoint=nStart
if(pLeft[nPoint]==1)
nCount++
while(nCount<m)
{
nPoint=nPoint%N+1
if(pLeft[nPoint]==1)
nCount++
}
(*nLeave)++
pLeft[nPoint]=0
return
nPoint
}
void
main(int
argc,
char
*argv[])
{
int
n=0,m=0,nLeave=0,nStart=1
printf("输入
人数n,上限m.\n")
scanf("%d,%d",&n,&m)
unsigned
char
*pLeft=(unsigned
char
*)calloc(n+1,sizeof(char))
memset(pLeft,1,(n+1)*sizeof(char))
while(nLeave<n)
printf("%d\t",nStart=fun(pLeft,
n,
&nLeave,
m,
nStart))
free(pLeft)
}
#include <stdio.h>int main(int argc, char *argv[])
{
char c1, c2
c1 = 97
c2 = 98
printf("c1=%c, c2=%c\n", c1, c2)
printf("c1=%d, c2=%d\n", c1, c2)
return 0
}
(1)
Output:
c1=a, c2=b
c1=97, c2=98
//c1和c2都经过整数提升,所以传递到printf时都为int类型,本质区别只有%d和%c
%c
// 需要一个int类型参数,输出对应的ASCLL编码(可能+本地多字节编码方案)
%d
// 需要一个int类型参数,输出对应十进制数的表示方法
(2)
// 首先分析char类型,有signed char 和 unsigned char 两种,具体取决于实现
// 而char类型参考C语言标准,最少为一个字节长度,而大多数实现,都是一个字节长度
// (参考: <limits.h>)
// 假设char为一个字节长度
// 如果char对应底层类型为 signed char (window, cocoa, unix都这样)
// 那么对有符号数赋值大于它的最大值(127)的结果是不确定的
// 对应C语言,未定义结果
// 那么,最可怕的就是可能程序崩溃
// 再假设在window平台下,197会对应字 11000101 强制不考虑符号赋值
// 那么 c1值为 -59
// 整数提升为int(x32) FFFF FFFF FFFF FFC5
// int(x16) FFFF FFC5
// window下,默认内码为GBK编码,而对应GBK编码,上述无解
// 你有可能看到一个?,或者什么都没有,或者程序报错都可能
(烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫)
(3)
// 如果改为int,参考(1)的分析,结果相同
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)