作业帮 > 综合 > 作业

一道c++的有趣题目一个商人有一些重要性相同的必须要完成的任务,为了决定完成任务的顺序,他做了一下的操作.他把所有任务写

来源:学生作业帮 编辑:灵鹊做题网作业帮 分类:综合作业 时间:2024/04/28 07:56:26
一道c++的有趣题目
一个商人有一些重要性相同的必须要完成的任务,为了决定完成任务的顺序,他做了一下的操作.
他把所有任务写成一个圆圈的形式,即第一个任务和最后一个相连.然后他随意挑选了一个数字r,顺时针(从任务1到2等等)从第一个任务数到第r个,把那个第r个任务移除表格,并从移除的下一个开始再数r个删除,反复如此操作直到剩下一个任务,输出这个任务.
读入:
必须读入从标准数据库读出数据.第一行有两个整数n 和r 彼此隔一个空格.n是任务数,大于2小于50,r是那个随机数字,大于1小于10000.
输出:输出一个任务.
例子 0
输入
4 2
a
b
c
d
输出 "a"
从 "a"开始数.所以 "a"=1,"b"=2.移除 "b",所以还剩 {a,c,d}.
从 "c"数.所以 "c"=1,"d"=2.移除 "d",所以剩 {a,c}.
从 "a"数.所以 "a"=1,"c"=2.移除"c",只剩下"a".
例子1输入
5 3
alpha
beta
gamma
delta
epsilon
输出:"delta"
例子 2 输入
26 17
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
输出:"n"
一道c++的有趣题目一个商人有一些重要性相同的必须要完成的任务,为了决定完成任务的顺序,他做了一下的操作.他把所有任务写
仔细看了这个问题,与约瑟夫问题有异曲同工之妙
下面是我的代码
int Task(PSeqList p,int n ,int r) //PSeqList p是一链表,你把读取的数据依次放入这里面
//n 是起始位置,题中的意思也就是从头开始,也就是0的意思,r和你题中的意思一样.
{
int s ,i ;
if( !p->length )
{
printf("表中无元素!\n")
return 0;
}
s=n-1;
printf("输出表中最后一个任务:\n")
for( i=p->length; i>=0 ; i++)
{
s=( s+ r -1) %i; //这里是每次循环跳到的位置,然后下面开始删除
Delete(p,s+1); //删去数到的这个任务
if(p->length==1)
printf("%c\t",p->data[0]); //输出最后一个任务
}
return 1;
}
有什么不懂的可以问我,以上算是这个问题的核心算法吧
再问: 问个弱智问题。。。 一般不是return0么。。。 还有 library。。。
再答: 其实return 0和1 全看你的想法,1可以代表任务完成也可以表示失败,同理0也是如此 还有这个函数有两个返回途径,一种成功一种失败,所以需要在末尾处添加return 1表示成功 不需要什么库,这些全是基础代码 单链表的定义和删除你不会吗??自己加上去就行了
再问: 木有学过单链表0。0。。。 我还以为这道题可以用string和pointer做呢。。。
再答: 额 单链表定义如下 typedef struct node{ char data[MAXSIZE]; int length; }*PSeqList; void Delete(PSeqList p , int x) //删除第 x个节点 { int j; if( ! p) { printf("表不存在!\n"); } if( x p->length ) { printf("删除位置不合法!\n"); } for( j=x; j< P->length; j++) { p->data[ j-1]=p->data [j] ; //删除此节点,所有元素值向上移动一位 p->length--; } }