您的位置:首页 > 其它

使用递归解决一种约瑟夫问题

2014-04-12 15:06 169 查看
约瑟夫问题问题描述: 输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。从数列首位置开始

计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为

止。如果计数到达数列尾段,则返回数列首位置继续计数。请编程实现上述计数过程,同时输出数值出列的顺序 比如: 输入的随机数列为:

3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置) 第一轮计数出列数字为2,计数值更新m=2,出列后数列为3,1,4,从

数值4所在位置从新开始计数第二轮计数出列数字为3,计数值更新m=3,出列后数列为1,4,从数值1所在位置开始计数第三轮计数出列数字

为1,计数值更新m=1,出列后数列为4,从数值4所在位置开始计数最后一轮计数出列数字为4,计数过程完成。输出数值出列顺序为:2,3,

1,4。

要求实现函数: void array_iterate(int len, int input_array[], int m, int output_array[])

【输入】 int len:输入数列的长度; int intput_array[]:输入的初始数列 int m:初始计数值

【输出】 int output_array[]:输出的数值出列顺序

【返回】无
示例 输入:int input_array[] = {3,1,2,4},int len = 4, m=7 输出:output_array[] = {2,3,1,4}

#include <stdio.h>
void printfdata(int data[], int len){
int i;
printf("\n");
for(i = 0; i < len; i++){
printf("%d\t", data[i]);
}
printf("\n");
}
void array_iterate(int len, int input_array[], int m, int output_array[]){
int i;
if(len < 1){
return ;
}

//当数组只有一个元素时,将该元素输出
if(len == 1){
*output_array = *input_array;
printf("%d\n", *input_array);
printf("%d\n", *output_array);
printf("????????????\n");
return ;
}
m = (m - 1) % len;
*output_array = input_array[m];
//数组重新排序
for(i = m; i < len - 1; i++){
input_array[i] = input_array[i + 1];
}
printf("**********************");
printfdata(input_array, len -1);
array_iterate(len -1, input_array, (*output_array + m) , output_array+1);
}

void main(){
int input[] = {3, 1, 2, 4, 4};
int output[5];
printfdata(input, 5);
array_iterate(5, input, 7, output);
printf("input数组为:\n");
printfdata(input, 5);
printf("输出数组为:\n");
printfdata(output, 5);
getchar();
}[出错记录]
m值更新错误,在m = (m - 1) % len;处, 和递归调用函数(*output_array + m)处;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: