OpenJudge 2746(三种方法解决Joseph问题)

#include<stdio.h>
#include<string.h>
int vis[310];
void joseph(int n,int m)
{
    int i,j,k;
    int cnt=0,count=0;
    memset(vis,0,sizeof(vis));//0表示未选中
    for(i=1;count<n-1;i=i%n+1)//循环 n-1次
    {
        if(vis[i]==0)
        {
           // vis[i]=1;
            cnt++;
        }
        if(m==cnt)
        {
            vis[i]=1;//出圈
            cnt=0;
            count++;
        }
    }
    for(j=1;j<=n;j++)
    if(vis[j]==0)
    {
        printf("%d\n",j);
        break;
    }
}
int main()
/*
[Linker error] undefined reference to `WinMain@16' ,便是把main 写成了mian
*/
{
    int m,n;
    while(scanf("%d%d",&n,&m),n||m)
        joseph(n,m);
    return 0;
}

/*

下面写递推公式:令f[i]表示i个人玩游戏报m退出最后胜利者的编号,最后的结果自然是f[n] 

递推公式  f[1]=0;  f[i]=(f[i-1]+m)%i; (i>1) 

因为实际生活中编号总是从1开始,我们输出f[n]+1  由于是逐级递推,不需要保存每个f[i]

*/
#include <stdio.h>
#include<stdlib.h>
int main()  

{
    int n,m,i,s=0;
    scanf("%d%d",&n,&m);
    for(i=2; i<=n; i++)
        s=(s+m)%i;
    printf("The winner is %d\n", s+1);
    system("pause");

} 

//尾插法带头结点的单向链表
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct Node
{
    int num;
    struct Node *next;
}Node;
int main()
{
    int i,j,n,m,count;
    Node *head,*p,*q;
    head=p=(Node *)malloc(sizeof(Node));
    while(scanf("%d%d",&n,&m),n||m)
    {
        for(i=1;i<=n;i++)
        {
            q=(Node *)malloc(sizeof(Node));
            q->num=i;
            p->next=q;
            p=p->next;
        }
        p->next=head;//构成循环链表 ,此时pq是一样的
        j=0,count=0;
        for(p=head,q=p->next;count<n-1;)
        {
            j++;
            if(j==m)//删除 q结点
            {
                p->next=q->next;
                free(q);
                q=p->next;//因为此时q已经释放,不能写成 q=q->next
                count++;//不能写在for内
                j=0;
            }
            else
            {
                p=p->next;
                q=p->next;
            }
            if(q==head)//数到头结点则跳过去
            {
                p=p->next;
                q=q->next;
            }
            /*
            if(count==n-1) break;
            这句也可,不要for内的条件判定,但是不可放在第一个if内 ;
            因为需要经过第二个if
            */
        }
        printf("%d\n",q->num);//或者p->next->num,因为最后就剩两个节点,且p=head,q=head->next
    }
    return 0;
}
/*
若是多次输入,第一次结果正确,再次输入相同内容,结果不对
很可能是因为某些语句位置不正确,特别是带break的,(比如
printf语句中的变量在break语句之后还会有变化)
*/ 

 

时间: 2024-09-19 00:18:59

OpenJudge 2746(三种方法解决Joseph问题)的相关文章

SimpleDateFormat线程不安全性的三种方法解决

在java项目中,我们通常会自己写一个dateutil类,处理日期和字符串的转换.如下   public class dateutil{ private static simpledateformat sdf = new simpledateformat("yyyymmdd"); public static formatdatetoyyyymmddstr(date date){ return sdf.format(date); } public static formatyyyymmd

三种方法解决IIS 6 目录检查安全漏洞

iis|安全|安全漏洞|解决 一 . Windows 2003 Enterprise Edition IIS6 目录检查漏洞的描述 1.Windows 2003 Enterprise Edition是微软目前主流的服务器操作系统. Windows 2003 IIS6 存在着文件解析路径的漏洞,当文件夹名为类似hack.ASP的时候(即文件夹名看起来像一个ASP文件的文件名),此时此文件夹下的任何类型的文件都可以在IIS中被当做ASP程序来执行.这样黑客即可上传扩展名为jpg或gif之类的看起来像

三种方法解决IIS6目录检查漏洞

iis|解决 一 . Windows 2003 Enterprise Edition IIS6 目录检查漏洞的描述 1.Windows 2003 Enterprise Edition是微软目前主流的服务器操作系统. Windows 2003 IIS6 存在着文件解析路径的漏洞,当文件夹名为类似hack.ASP的时候(即文件夹名看起来像一个ASP文件的文件名),此时此文件夹下的任何类型的文件都可以在IIS中被当做ASP程序来执行.这样黑客即可上传扩展名为.jpg或.gif之类的看起来像是图片文件的

三种方法解决关闭xp自动更新工具的问题

  方法一 鼠标左键点击桌面左下角的开始菜单按钮,然后在出现的上拉菜单上面点击设置,然后在设置的侧拉菜单上面点击控制面板 点击控制面板以后会出现控制面板窗口,在控制面板窗口里面点击安全中心 点击安全中心以后会出现Windows安全中心窗口,在安全中心窗口上面点击自动更新 点击自动更新以后会出现自动更新窗口,在自动更新窗口下面点击选中关闭自动更新然后点击确定就可以了 方法二 鼠标右键点击我的电脑图标,会出现侧拉菜单,然后在侧拉菜单上面鼠标点击属性 点击属性以后会出现系统属性窗口,在系统属性窗口上面

苹果Mac虚拟机安装Win7系统的三种方法介绍

  苹果Mac虚拟机安装Win7系统的三种方法介绍          解决方法一: 1.我们这里以免费的虚拟机Virtual Box为例; 2.启动 Virtual Box 以后,点击窗口左上角的"新建"按钮; 3.接下来为虚拟取一个名称,可随意取.系统类型保持不变,版本在下拉列表中选择 Windows 7.点击"继续"按钮; 注:如果你安装的是 Windows 64 系统的话,在下拉列表中选择时,请选择 Windows 7 (64 bit). 4.然后为虚拟机分配

win7电脑加快硬盘读取速度的三种方法

  win7电脑加快硬盘读取速度的三种方法 1.我们一系统盘为例,来清除一下系统盘的磁盘碎片,大家可以把各个盘的碎片都清理一下; 2.右击系统盘,点击属性; 3.在常规选项里面我们点击一下磁盘清理!电脑会显示正在计算可以释放多少空间; 4.我们选择需要清理的文件清理删除掉!在常规选项里面,我们可以选择删除不用的程序; 5.我们在计算机属性的工具里面点击磁盘碎片整理. 解决方法2: 1.我们使用杀毒软件彻底给磁盘杀毒. 解决方法3: 1.我们下载HD Tune软件!百度搜一下,随便下载一个破解版就

php去除换行(回车换行)的三种方法

 这篇文章主要介绍了php去除换行(回车换行)的三种方法,需要的朋友可以参考下  代码如下: <?php     //php 不同系统的换行   //不同系统之间换行的实现是不一样的   //linux 与unix中用 n   //MAC 用 r   //window 为了体现与linux不同 则是 rn   //所以在不同平台上 实现方法就不一样   //php 有三种方法来解决     //1.使用str_replace 来替换换行   $str = str_replace(array(&quo

PHP把网页保存为word文件的三种方法

 最近工作遇到关于生成word的问题,现在总结一下生成word的三种方法的相关资料,需要的朋友可以参考下 一.PHP生成word的两种思路或原理   1.利用windows下面的 com组件 2.利用PHP将内容写入doc文件之中 具体实现方法如下.   二.利用windows下面的com组件   原理:com作为PHP的一个扩展类,安装过office的服务器会自动调用word.application的com,可以自动生成文档,PHP官方文档手册:http://www.php.net/manua

安装惠普笔记本XP三种方法

安装惠普笔记本XP三种方法 方法一.直接下载集成SATA驱动HP OEM XP PRO安装盘     本光盘以HP OEM XP PRO为基础制作的,集成了硬盘SATA驱动,其余部分未做任何改动或者优化:本光盘适用于HP笔记本和台式机,别的品牌电脑安装前,必须更改BIOS信息: 下面是电驴下载地址ed2k://|file|HP_OEM_XP_PRO.ISO|523925504|17212667C9222AB491D6FABC74E3389C|h=2YWMQDAIVXD5NSWV3WNVRSLPR