zoukankan      html  css  js  c++  java
  • 约瑟夫问题的实现(0956)

    题目描述

    n个人围成一个圈,每个人分别标注为1、2、...、n,要求从1号从1开始报数,报到k的人出圈,接着下一个人又从1开始报数,如此循环,直到只剩最后 一个人时,该人即为胜利者。例如当n=10,k=4时,依次出列的人分别为4、8、2、7、3、10,9、1、6、5,则5号位置的人为胜利者。给定n个 人,请你编程计算出最后胜利者标号数。(要求用单循环链表完成。)

    input

    第一行为人数n;
    第二行为报数k

    output

    输出最后胜利者的标号数。

    样例输入

    10
    4
    样例输出
    5
     
    这道题的思路是构建一个环形链表,然后用一个指针在环形链表上移动,找出最后的胜利者。
    代码如下
     1 #include<iostream>
     2 #include<stdlib.h>
     3 using std::cin;
     4 using std::cout;
     5 using std::endl;
     6  
     7 int n;
     8 struct node{
     9     int num;
    10     node*next;
    11 }; 
    12  
    13 node*create(node*head){
    14     int a=1;
    15     head=(node*)malloc(sizeof(node));
    16     node*p=NULL,*q=NULL;
    17     p=head;
    18     p->num=1;
    19     p->next=head;
    20     int i;
    21     for(i=1;i<n;i++){
    22         q=(node*)malloc(sizeof(node));
    23         p->next=q;
    24         q->num=i+1;
    25         q->next=head;
    26         p=q;
    27     }
    28     return head;
    29 }
    30 node*del(node*p,int m){
    31     int i;
    32     for(i=2;i<m;i++){
    33         p=p->next;
    34     }
    35     node*temp=NULL;
    36     temp=p->next;
    37     p->next=temp->next;
    38     free(temp);
    39     return p;
    40 }
    41 int main(){
    42     node*p=NULL;
    43     cin>>n;
    44     p=create(p);
    45     int m;
    46     cin>>m;
    47     int t=n;
    48     for(int i=1;i<n;i++){
    49         p=del(p,m);
    50         p=p->next;
    51     }
    52     cout<<p->num;
    53     return 0;
    54 }
  • 相关阅读:
    H5页面开发的touchmove事件
    css奇技淫巧—border-radius
    css奇技淫巧—box-shadow与outline绘制多重边框效果
    移动前端自适应解决方案和比较
    rem字体在rem盒子里面不一样,或者不同的行解决
    rem 回家测试
    js中函数提升及var变量提示
    盒子模型的百分比是根据什么来的
    $(function(){})返回值$(document)
    开发过程中错误总结
  • 原文地址:https://www.cnblogs.com/swust-wangyf/p/6725156.html
Copyright © 2011-2022 走看看