华为机考--约瑟夫问题

问题描述:    
输入一个由随机数组成的数列(数列中每个数均是大于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。

采用循环链表的方式实现:

 1 #include <iostream>
 2 using namespace std;
 3
 4 struct NODE{
 5     int num;
 6     NODE *next;
 7 };
 8
 9
10 int main()
11 {
12     char s[50];
13     int m;
14     NODE *pNew=NULL,*pHead=NULL,*pRear=NULL,*pTemp=NULL;;
15     int i;
16     while(cin>>s>>m)
17     {
18         for (i=0;s[i];i++)
19         {
20             pNew=new NODE;
21             pNew->num=s[i]-‘0‘;
22             if (i==0)
23             {
24                 pHead=pRear=pNew;
25             }
26             else
27             {
28                 pRear->next=pNew;
29             }
30             pNew->next=NULL;
31             pRear=pNew;
32         }
33         pRear->next=pHead;
34         for (i=0;i<s[i];i++)
35         {
36             pTemp=pHead;
37             for (int i=1;i<m;i++)
38             {
39                 pTemp=pHead;
40                 pHead=pHead->next;
41             }
42             pTemp->next=pHead->next;
43             m=pHead->num;
44             pHead=pTemp->next;
45             cout<<m;
46         }
47         cout<<endl;
48     }
49     return 0;
50 }

运行结果:

时间: 2024-11-10 11:04:47

华为机考--约瑟夫问题的相关文章

20150912华为机考1之&quot;输入一个字符串,将其中出现次数最多的字符输出&quot;

不吐槽华为的服务器了,直接上正文 输入:字符串(英文字母),长度不超过128 输出:出现频率最高的字母 思路写在注释文档 /* Input a string * Output the most frequent character * * The way of thinking: * using ASCII, count the number of each character * then find out the max number(max_num) * and its according

20150912华为机考2之&quot;输入一段字符串(英文),将每个单词首字母大写后输出&quot;

还有其他一些(隐性)要求(要不然无法通过测试): 1.如果首字母已经大写,则不用变 2.不是英文字母的不变 e.g. Input: hello world! this is _Ljj speaking! Output: Hello World! This Is _ljj Speaking! 思路写在注释里面了 /* Input a string * Output: uppercase the first character of evrey word * if already uppercase

华为机考--数组比较

比较两个数组,要求从数组最后一个元素开始逐个元素向前比较,如果2个数组长度不等,则只比较较短长度数组个数元素.请编程实现上述比较,并返回比较中发现的不相等元素的个数 比如: 数组{1,3,5}和数组{77,21,1,3,5}按题述要求比较,不相等元素个数为0 数组{1,3,5}和数组{77,21,1,3,5,7}按题述要求比较,不相等元素个数为3 要求实现函数: int array_compare(int len1, int array1[], int len2, int array2[]) [

华为机考--简单四则运算

问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值 注: 1.表达式只含 +, -, *, / 四则运算符,不含括号 2.表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况 3.要考虑加减乘除按通常四则运算规定的计算优先级 4.除法用整数除法,即仅保留除法运算结果的整数部分.比如8/3=2.输入表达式保证无0作为除数情况发生 5.输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况 要求实

华为机考--亮着电灯的盏数

亮着电灯的盏数 一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1.2.3.…n-1.n.每盏电灯由一个拉线开关控制.开始,电灯全部关着.有n个学生从长廊穿过.第一个学生把号码凡是1的倍数的电灯的开关拉一下:接着第二个学生把号码凡是2的倍数的电灯的开关拉一下:接着第三个学生把号码凡是3的倍数的电灯的开关拉一下:如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下.n个学生按此规定走完后,长廊里电灯有几盏亮着.注:电灯数和学生数一致. 用C++实现: 1 #inc

华为机考--字符串压缩

通过键盘输入一串小写字母(a~z)组成的字符串.请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串. 压缩规则: 1. 仅压缩连续重复出现的字符.比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc". 2. 压缩字段的格式为"字符重复的次数+字符".例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz" 1 #include <iost

华为机试—约瑟夫环替换计数器m(数组解决)

题目描述: 输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m.从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止.如果计数到达数列尾段,则返回数列首位置继续计数.请编程实现上述计数过程,同时输出数值出列的顺序 比如: 输入的随机数列为:3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置) 第一轮计数出列数字为2,计数值更新m=2,出列后数列为3,1,4

华为机试—约瑟夫环替换计数器m(循环链表解决)

题目描述: 输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m.从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止.如果计数到达数列尾段,则返回数列首位置继续计数.请编程实现上述计数过程,同时输出数值出列的顺序 比如: 输入的随机数列为:3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置) 第一轮计数出列数字为2,计数值更新m=2,出列后数列为3,1,4

华为机考题 004字符串分割

转自:http://blog.csdn.net/sxl_545/article/details/52412203 华为机考题 004字符串分割 标签: 华为机考刷题 2016-09-02 11:10 46人阅读 评论(0) 收藏 举报  分类: 华为机考刷题(3)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 题目描述 •连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组:•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理. 输入描述: 连续输入