原题链接:[编程入门]报数问题
解题思路:设置一个数组,数组大小为输入的数字n,下标0-n-1储存着1-n.再利用循环开始计数,如果count为3,那么就将此时的数组储存的数赋值为0
,直到这个数组中的数只有一个不为0,就退出循环,再返回不为零的数下标,最后打印结果
这个好像是约瑟夫问题,用数组的话属于线性的结构,还可以用链表属于非线性的结构,不过小白我还是太懒了,大家如果有兴趣的可以交流一下,用链表的话就是节点数据域储存的是数字1-n,然后创建一个循环链表,就是将头尾的指针连接起来,将count到3的时候就将这个节点删除,最后如果只剩下一个节点的话就将这个节点的数据返回就行,这个难度应该不高,可以参考一下数据结构的链表,但是比起数组来的话就不用考虑那么多下表的对齐问题了,但是指针的操作还是难了一点。
约瑟夫公式:f(i)=[f(i-1)+n]%i,i为第几次循环,n为报到的那个数字,m为总人数,f(0)=0,只有一个元素的时候
#include<stdio.h> int main(){ int m,n; scanf("%d %d",&m,&n); int i=0; int s=0; for(i=2;i<=m;i++){ s=(s+n)%i; } printf("%d",s+1); return 0; }
本人纯纯小白,小辣鸡一个,如果有错的话大家都可以指正,感谢大家!
注意事项:返回得到结果的下标要加上1
#includeint main(){ int n,i; //n为输入的n个数,i用来全局遍历循环 scanf("%d",&n); //输入n,并定义数组大小 int a[n]; int count=1; //count用来计数,当其等于3的时候就会将a[i]=0 int sum=0; //sum是大小为n的数组里面有多少个不是0的元素 for(i=0;i<n;i++){ //输入n个元素,注意下标和值相差1 a[i]=i+1; } int j=0; //接受最终答案用的,注意不能为局部变量 while(sum!=1){ //如果sum=1说明只有数组内只有一个不为零的数,那么就是结束循环 sum=0; //进入下一次循环都会重新求sum,sum为全局变量,消除上次循环的数,所以清零 for(i=0;i<n;i++){ //利用判断语句将0的元素跳过,相当于将念到3的踢出去 if(a[i]!=0){ //注意count=1是因为数组的下标和其储存的数相差1的原因 if(count==3){ a[i]=0; count=1; } else count++; } } //计算数组中不为零的数 for(i=0;i<n;i++){ if(a[i]!=0){ sum++; j=i; } } } printf("%d",j+1); //注意结果要加上1,就是因为数组的下标和其储存的数相差一的原因,按上面说过 return 0; }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复