《编程珠玑》第二章 “杂技算法” 和 “翻转算法” C语言实现
2012-10-29 19:55
525 查看
《编程珠玑》第二章 “杂技算法”和“翻转算法” C语言实现
题目:将一个n元一维数组a
左移i个位置。例如,当n=8,i=3时,数组abcdefgh旋转为defghabc。请设计一个算法完成这个任务。
杂技算法
分析:将a[0]存储在一个临时变量中,然后将a[i]替换a[0],a[2i]替换a[i]….当一个循环结束的时候,若替换次数小于n,则从a[1]开始替换…,需要经过gcd(n,i)(n和i的最大公约数)次循环后,才能把每一个元素都移到该移的地方。
翻转算法
我们将问题看成把数组ab转换成ba,同时假定我们拥有一个函数可以将数组中的特定部分元素求逆。从ab开始,先对a求逆,得到ar b,然后对b求逆,得到ar br ,然后整体求逆,得到(ar br)r 。此时就是ba。
以上。
题目:将一个n元一维数组a
左移i个位置。例如,当n=8,i=3时,数组abcdefgh旋转为defghabc。请设计一个算法完成这个任务。
杂技算法
分析:将a[0]存储在一个临时变量中,然后将a[i]替换a[0],a[2i]替换a[i]….当一个循环结束的时候,若替换次数小于n,则从a[1]开始替换…,需要经过gcd(n,i)(n和i的最大公约数)次循环后,才能把每一个元素都移到该移的地方。
/* ** ** tcpipstack @29/10/2012. ** shenzhen. ** */ #include <iostream> #include <string> using namespace std; /* Acrobat Rotate Shift Alogrithm */ string AcrobatRotateShift(string str, int n); // int main(void) { string str1 = "abcdefg"; string str2 = ""; cout<<"str1= "<<str1<<endl; cout<<"str2= "<<str2<<endl; str2 = AcrobatRotateShift(str1, 2); cout<<"str1= "<<str1<<endl; cout<<"str2= "<<str2<<endl; getchar(); return 0; } /* * * the Acrobat Rotate Shift Alogrithm * */ string AcrobatRotateShift(string str, int n) { int strlen = str.length(); int count = 0; //统计移动次数 int i, j = 0; //k初始化为0,从str[0]开始 char temp; while (1) { //开始的元素保存到临时变量temp中 temp = str[j]; i = (j + n) % strlen; //开始移动,直到遇到开始的元素 while (i != j) { str[(i - n + strlen) % strlen] = str[i]; count++; //移动次数统计量+1 i = (i + n) % strlen; } //临时变量temp中保存的值赋值给刚才移动的最后一个位置 str[(j - n + strlen) % strlen] = temp; count++; //判断是否所有元素都已经移动 if (count < strlen) { //没有移动所有元素,再次从str[j+1]开始 j++; } else { //所有元素都已经移动,跳出循环 break; } } return str; }
翻转算法
我们将问题看成把数组ab转换成ba,同时假定我们拥有一个函数可以将数组中的特定部分元素求逆。从ab开始,先对a求逆,得到ar b,然后对b求逆,得到ar br ,然后整体求逆,得到(ar br)r 。此时就是ba。
/* ** ** tcpipstack @29/10/2012. ** shenzhen. ** */ #include <iostream> #include <string> using namespace std; string Reverse(string str, int m, int n); string InverseRotateShift(string str, int n); // int main(void) { string str1 = "abcdefg"; string str2 = ""; cout<<"str1= "<<str1<<endl; cout<<"str2= "<<str2<<endl; str2 = InverseRotateShift(str1, 5); cout<<"str1= "<<str1<<endl; cout<<"str2= "<<str2<<endl; getchar(); return 0; } // string Reverse(string str, int m, int n) { char temp; while (m < n) { temp = str[m]; str[m] = str ; str = temp; m++; n--; } return str; } string InverseRotateShift(string str, int n) { int strlen = str.length(); str = Reverse(str, 0, n-1); str = Reverse(str, n, strlen-1); str = Reverse(str, 0, strlen-1); return str; }
以上。
相关文章推荐
- 《编程珠玑》第二章 “杂技算法” 和 “翻转算法” C语言实现
- 《编程珠玑》第二章 “杂技算法” 和 “翻转算法” Java语言版
- 编程珠玑第二章的算法实现
- 严蔚敏版《数据结构》第二章线性表的算法C语言实现
- 左右图片翻转算法(c语言)实现
- C语言之linux内核实现最大公约数算法
- C语言几种简单的算法实现2
- 10个重要的算法C语言实现源代码:拉格朗日,牛顿插值,高斯,龙贝格,牛顿迭代,牛顿-科特斯,雅克比,秦九昭,幂法,高斯塞德尔
- 数值作业:变步长梯形求积算法计算积分C语言实现
- 10个重要的算法C语言实现源代码:拉格朗日,牛顿插值,高斯,龙贝格,牛顿迭代,牛顿-科特斯,雅克比,秦九昭,幂法,高斯塞德尔
- C语言实现快排、归并排序、快排改进算法的递归和非递归算法
- C语言实现一个数的二进制位模式从左到右翻转后的值
- C语言之实现随机数产生算法
- 数值计算方法与算法:C语言实现利用Gauss消元法解方程组
- 【C语言】朴素字符串匹配算法及其实现
- 数字图像处理领域的二十四个典型算法及vc实现、第二章
- 杂谈PID控制算法——最终篇:C语言实现51单片机中的PID算法
- C语言qsort算法的指针实现
- 《数据结构与算法分析--c语言描述》之第二章:算法分析
- 二维、结构网格单相流SIMPLE 算法的C语言实现