• 【约瑟夫环】C语言数组法+java循环链表法


     1 /**
     2     约瑟夫环:借助数组
     3     len:     表示人数
     4     target:  表示喊到该口号的出局。
     5     flag:    表示当前哥们喊的口号 范围【1,2,3】
     6     default: 从1开始数
     7 **/
     8 int YSF(int len,int target,int start){
     9     int end = len+1;
    10     int *a = (int*)malloc(sizeof(int)*end);
    11     int i = 0,flag = 1,count = 0;
    12 
    13     //初始化数组元素 都为0
    14     for(;i<=len;i++) a[i] = 0;
    15 
    16     //i作为游标
    17     i = start;
    18     while(count != len-1){
    19         //当i游到最后一个元素的时候,应该继续从第一个元素开始
    20         if(i == end) i = 1;
    21         if(a[i]!=1) {
    22             if(flag > target) flag = 1;
    23             if(flag == target) { printf("%d ",i); a[i] = 1;count++; }
    24             flag++;
    25         }
    26         i++;
    27     }
    28     putchar(10);
    29 
    30     //遍历数组元素  找到那个值为0的元素,就是剩下的那个人
    31     for(i = 1;i<=len;i++){
    32         if(a[i]==0) a[0] = i;
    33         printf("%-2d",a[i]);
    34     }
    35     putchar(10);
    36     return a[0];
    37 }
     1 //约瑟夫环
     2 public class Main {
     3     
     4     //定义链表节点类型
     5     public static class Node{
     6         int data;
     7         Node next;
     8     }
     9     
    10     //初始化循环链表数据
    11     static Node initData(Node head){
    12         int[] arr = {1,2,3,4,5,6,7,8,9,10};
    13         Node tail = null;
    14         for(int i:arr){
    15             Node node = new Node();
    16             node.data = i;
    17             if(i==1) {
    18                 head = node;
    19                 tail = head;
    20             } else {
    21                 tail.next = node;
    22                 tail = node;
    23             }
    24         }
    25         tail.next = head;
    26         return head;
    27     }
    28     
    29     //打印循环链表
    30     static void printLK(Node head){
    31         Node p = head;
    32         while(p.next!=head){
    33             System.out.print(p.data+" ");
    34             p = p.next;
    35             if(p.next==head) System.out.print(p.data+" ");
    36         }
    37         System.out.println();
    38     }
    39     
    40     //模拟约瑟夫环过程
    41     // p   当前节点
    42     // pre 当前节点的前一个节点
    43     // t   当前节点的后一个节点
    44     static void YSF(Node head){
    45         Node pre=null,p,t=null;
    46         p = head;
    47         int flag = 1;
    48         while(p.next!=p){
    49             if(flag==3){
    50                 t = p.next;
    51                 pre.next = t;
    52                 p = t;
    53                 flag = 1;
    54             } else {
    55                 pre = p;
    56                 p = p.next;
    57                 flag++;
    58             }
    59         }    
    60         System.out.println(p.data);
    61     }
    62     
    63     //主函数
    64     public static void main(String[] args) {
    65         Node head = null;
    66         head = initData(head);
    67         printLK(head);
    68         YSF(head);
    69     }
    70 }
  • 相关阅读:
    C#中Dictionary的用法
    安装 Hyperledger Explorer及翻译中文
    Centos7 区块链 HyperLedger Fabric1.0.0安装
    install Hyperledger Fabric Ubuntu 16.04 x64
    三大方案解决了Intellij IDEA 2017/2018.1.5 输入法 不跟随
    ### Cause: java.sql.SQLException: Connection is read-only. Queries leading to data modification are
    could not find implicit value for parameter param: org.apache.spark.AccumulatorParam
    面试感悟----一名3年工作经验的程序员应该具备的技能
    Jenkins Git Maven搭建自动化部署项目环境 邮件通知
    前缀、中缀、后缀表达式
  • 原文地址:https://www.cnblogs.com/czsblog/p/15516568.html
Copyright © 2020-2023  润新知