经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
猴子选大王问题
来源:cnblogs  作者:沉云  时间:2018/11/20 19:52:04  对本文有异议

问题分析:

方法一:

            创立一个记录编号的数组,用指针在这个数组循环移动计数,当计数为m时将这个元素做移除标记,直到剩下最后一个元素。

 

  1. 1 int main()
  2. 2 {
  3. 3 int n,m;
  4. 4 scanf("%d %d",&n,&m);
  5. 5 int v[n];
  6. 6 int i;
  7. 7 for(i=0; i<n; i++)
  8. 8 {
  9. 9 v[i]=i+1;
  10. 10 }
  11. 11 int *p=&v[0];
  12. 12 int z=0,x=1,co=1;//z为剔除元素个数,x为元素在数组中位置,co为计数
  13. 13 for(;;)
  14. 14 {
  15. 15 while(*p==0)//当在循环中遇到已经剔除的元素,略过
  16. 16 {
  17. 17 if(x==n)
  18. 18 {
  19. 19 x=1;
  20. 20 p=&v[0];
  21. 21 continue;
  22. 22 }
  23. 23 p++;
  24. 24 x++;
  25. 25 }
  26. 26 if(co==m)//当计数等于m,剔除该元素
  27. 27 {
  28. 28 co=0;
  29. 29 *p=0;
  30. 30 z++;
  31. 31 }
  32. 32 if(co!=m)//若计数不等于m,继续计数
  33. 33 {
  34. 34 if(x==n)//当这个猴子时最后一个,转向让第一个猴子报数
  35. 35 {
  36. 36 x=1;
  37. 37 p=&v[0];
  38. 38 co++;
  39. 39 continue;
  40. 40 }
  41. 41 p++;
  42. 42 x++;
  43. 43 co++;
  44. 44
  45. 45 }
  46. 46 if(z==n-1)
  47. 47 break;//当剩下一个猴子时
  48. 48 }
  49. 49 for(i=0;; i++)
  50. 50 {
  51. 51 if(v[i]!=0)
  52. 52 {
  53. 53 printf("%d",v[i]);
  54. 54 break;
  55. 55 }
  56. 56 }
  57. 57 return 0;
  58. 58 }
View Code

 方法二:

            创立一个大小为n*n的数组,记录n次编号,用指针单向移动来假循环,当计数为m时把n个元素做移除标记,直到剩下最后一个元素。

 

  1. 1 #include<stdio.h>
  2. 2 int main()
  3. 3 {
  4. 4 int n,m;
  5. 5 scanf("%d %d",&n,&m);
  6. 6 int v[n*n];
  7. 7 int i,c;
  8. 8 for(c=0; c<n; c++)//将数组循环赋编号,共赋n个
  9. 9 {
  10. 10 for(i=0; i<n; i++)
  11. 11 {
  12. 12 v[i+c*n]=i+1;
  13. 13 }
  14. 14 }
  15. 15 int *p=&v[0];
  16. 16 int z=0,co=1;//co为计数
  17. 17 for(;;)
  18. 18 {
  19. 19 if(co==m)//当计数等于m,在v[n*n]里剔除该元素
  20. 20 {
  21. 21 for(i=0; i<n; i++)
  22. 22 {
  23. 23 if(v[i]==*p)
  24. 24 {
  25. 25 for(c=0; c<n; c++)
  26. 26 {
  27. 27 v[i+c*n]=0;
  28. 28 }
  29. 29 break;
  30. 30 }
  31. 31 }
  32. 32 co=0;
  33. 33 z++;
  34. 34 }
  35. 35 if(co!=m)
  36. 36 {
  37. 37 p++;
  38. 38 co++;
  39. 39 }
  40. 40 while(*p==0)//当遇到已经剔除的元素时
  41. 41 {
  42. 42 p++;
  43. 43 }
  44. 44 if(z==n-1)
  45. 45 break;//当剩下一个猴子时
  46. 46 }
  47. 47 for(i=0; i<n; i++)
  48. 48 {
  49. 49 if(v[i]!=0)
  50. 50 {
  51. 51 printf("%d",v[i]);
  52. 52 break;
  53. 53 }
  54. 54 }
  55. 55 return 0;
  56. 56 }
View Code

 

 

 

未完待续......

 

 

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号