您的位置:首页 > 编程语言 > C语言/C++

《编程珠玑》第二章 “杂技算法” 和 “翻转算法” 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的最大公约数)次循环后,才能把每一个元素都移到该移的地方。

/*
**
**	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;
}


以上。


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: