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

简介: #include #include int vis[310]; void joseph(int n,int m) { int i,j,k; int cnt=0,count=0; memset(vis,0,sizeof(vis));//0表示未选中 ...
#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语句之后还会有变化) 
*/ 
                
    


       

 

目录
相关文章
|
1月前
|
缓存 前端开发 JavaScript
componentWillMount()方法有什么用
componentWillMount() 是 React 组件生命周期中的一个方法,在组件首次渲染之前调用。可以用来进行初始化操作,如设置状态或加载数据,但不建议在此方法中执行复杂的异步操作。注意,此方法在 React 16.3 版本后已被标记为不安全,建议使用替代方法。
|
3月前
|
机器学习/深度学习 自然语言处理 API
10-22|处理脏话其他方法
10-22|处理脏话其他方法
|
SQL 数据库
SqlCommand.ExecuteNonQuery 方法
SqlCommand的一个类,用于包含update、insert、delete、select的Transact-sql 语句中来修改数据库中的数据,并返回结果。
|
JavaScript 前端开发
getMonth() 方法
getMonth() 方法
186 0
|
存储 JavaScript 前端开发
JavaScript继承的几种方法
JavaScript继承的几种方法
142 0
JavaScript继承的几种方法
|
Java 开发者
|
测试技术 C#
分享几个实用的方法
  今天主要和大家分享的是本人总结的分页执行方法,也可以说就是分批执行;该篇采用java8新增的表达式来操作,希望能给各位带来好的帮助和在日常工作中提供便利;同样的操作流程和逻辑之前用C#代码写过一次,有需要的朋友可以看以前的博文; 分页方式拆分List为多个子集List方法 执行统一方法-无...
1212 0
|
C# 编译器 索引