标题:刚开始学习C,请教高手师傅
只看楼主
gscao
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-3-13
结帖率:0
已结贴  问题点数:20 回复次数:6 
刚开始学习C,请教高手师傅
请画出编写此程序的N-S结构图或写出程序(不限编程语言)。
公主和王子相好了,而国王要给公主举行盛大的选亲仪式,方法如下:
将所有参选的选手站成一圆圈,让他们从按顺时针开始“一”、“二”、“三”、“一”、“二”、“三”……依次报数,报“三”的选手退场,直到场上剩余一人为至,这个人将成为附马。
选亲仪式开始之前,公主告诉王子参选选手刚好50人,聪明的王子经过简单的计算,站到了队列里。活动结束时,场上只剩王子一人了。
如果你是王子,你应该站在什么位置?
搜索更多相关主题的帖子: 学习 师傅 
2010-03-13 20:05
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
得分:3 
约瑟夫环问题,网上多的是,随便搜一下就行了!

★★★★★为人民服务★★★★★
2010-03-13 20:14
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
得分:3 
算法是灵魂啊,学习下数学吧 !
2010-03-13 20:20
xu362726904
Rank: 6Rank: 6
等 级:侠之大者
帖 子:160
专家分:471
注 册:2009-6-18
得分:3 
#include"stdio.h"
main()
{
    int a[50],i,count=0,k=0;
    for(i=0;i<50;i++)
    a[i]=i+1;
    i=0;
    while(count<49)
    {
     if(a[i]!=0) k++;
      if(k==3)
       {
       count++;
       a[i]=0;
       k=0;
       }
    i++;
    if(i==50) i=0;   
   
    }
    for(i=0;i<50;i++)
    if(a[i]!=0)
    printf("%d",a[i]);
}
2010-03-13 21:06
ldg628
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:3
帖 子:526
专家分:3036
注 册:2009-6-23
得分:3 
#include <stdio.h>
#include <stdlib.h>
1.数组法
int main(void)
{
    int i, j, n, *a,tmp;
    scanf("%d", &n);
    tmp = n;
    a = (int *)malloc(sizeof(int)*n);
    memset(a, 0, sizeof(int)*n);
    i = 1, j = 0;
    while(1)
    {
        while(!a[j])
        {
            if(i++ == 3)
            {
                a[j] = 1;
                i = 1;
                if(!(--tmp))
                {
                    printf("No.%d\n", j+1);
                    free(a);
                    return 0;
                }
            }
            if(++j == n) j=0;
        }
        if(++j == n) j=0;
    }
}
2.链表法:
typedef struct _node{
    int No;
    struct _node *next;
}node;
int main(void)
{
    int i, n,;
    node *tail, *p, *q;
    scanf("%d", &n);
    q = (node *)malloc(sizeof(node));
    q->No = n;
    q->next = q;
    tail = q;
    for (i = n-1; i > 0; i--)
    {
        p = (node *)malloc(sizeof(node));
        p->No = i;
        p->next = q;
        q = p;
    }
    tail->next = p;
    i = 0;
    q = tail;
    while(p != p->next)
    {
        if (++i == 3)
        {
            q->next = p->next;
            i = 0;
            free(p);
            p = q->next;
            continue;
        }
        q = p;
        p = p->next;
    }
    printf("\t No.%d\n", p->No);
    free(p);
}
2010-03-13 23:06
hziee
Rank: 4
等 级:业余侠客
帖 子:64
专家分:257
注 册:2010-3-12
得分:3 
约瑟夫环问题,可以用数组和链表实现,网络上算法很多。这里介绍一种用数组的实现的方法。

思路:50个人分别以1-50编号,从第一位开始1到3报数,报到3的人,把编号设置为0,直到完成一轮循环。
然后进行第二论循环,这次编号为0的人,不参加报数。直到有49个人编号设置为0。

#include<iostream>
using namespace std;


int main()
{int a[50]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49.50};
 int i,j,k=0;
 for(i=0;i<48;) //当设置编号为0的人达到49人,退出循环
     {for(j=0;j<50;j++)
         {if(a[j]!=0)//判断人员编号是否为0
            {k++;
               if(k%3==0)//是否为3的倍数
                  {
                    a[j]=0;//设置人员编号为0;
                    i++;//人员不参与报数的加1
                   }
            }
         }
      }
for(j=0;j<50;j++)
    if(a[j]!=0)cout<<a[j]<<endl;//输出非0数据

return 0;
}

结果:编号第8个人
2010-03-13 23:17
简体中文
Rank: 1
等 级:新手上路
帖 子:19
专家分:6
注 册:2010-2-26
得分:3 
{int a[50]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49.50};
有10000个人,你还得写10000个数啊?
2010-03-13 23:47



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-299315-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.074013 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved