c语言怎么知道文件题目做得对不对,C语言中我如果看到一个题目,我该怎么着手去编写程序...

本文通过分析约瑟夫环问题,利用面向过程编程思路进行解答。首先,通过数组模拟报数过程,然后设计while循环,根据报数的倍数消除对应编号的人。在循环中,当报数达到特定条件时更新数组状态,直至只剩一人。程序通过伪代码描述,逐步细化编码,最后验证结果并探讨可能的优化方案。这种方法对于理解和解决这类问题具有指导意义。
摘要由CSDN通过智能技术生成

面向过程编程的一般思路:分析问题->设计流程和模块->编码和测试->改进并总结

做算法问题的一般思路:先用数学方法计算分析,充分理解问题。在思考程序哪些地方应该用循环、指针或数组等细节问题之前,先要确定程序的大体框架,可以自己先试着用伪代码描述整个算法,然后再一步步的确定应该怎么编码。最后验证结果并反思能否改进算法。

本题思路:1.在草稿纸上简单的分析发现,这个报数过程可以用数组来模拟。

2.建一个21位的数组,数组索引代表每个人的编号,数组值代表1代表在圈中0代表离开。

3.在只剩一人之前不断的循环报数,故考虑用while循环。

4.while没循环一次就相当于报一个数(num++),如果此时报的数能被5整除,就把数组索引(i)处的值改为0,然后下一个人报数(i++)。i大于21的时候需要把i变成i除21的余数(人是围成一个圈编号21的下一位是1)。

5.考虑一般情况,所以把人数和报数倍数定义为宏,就能只修改宏的值就能计算所有的此类问题

#include

#include

#define N 21//人数

#define M 5//报数的倍数

int main()

{

int i,

num,//报的数字

left = N,//圈子剩余的人数

people[N];//1表示还在圈中,0表示出去

for(i=0;i

people[i]=1;

//开始报数

i=0;

num=0;

//报数一个回合

while(left>1)

{

if(i>=N)

i=i%N;

if(people[i]==1)

{

++num;

if(num%M==0)

{

people[i]=0;

--left;

}

}

++i;//继续报

}

for(i=0;i

{

if(people[i]==1)

printf("Id:%d",i+1);

}

getch();

return 0;

}

编程很难一蹴而就。自己完全独立的完成一些问题,由易到难循序渐进。就能慢慢进步。

取消

评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值