C语言作业要程序

C语言作业要程序,第1张

约瑟夫环问题,真是难得还能看到有深度的帖子。。有个完整的算法。。你可以借鉴一下。

#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)的分析,结果相同


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存