/**
* @ File 020_move_string.c
* @ Author dinghuaneng
* @ Date 2011.06.22
* @ Brief rotate the string to the left, that is, to move the circle to the left. Algorithm .
* The last method is very efficient in time and space, and Code Short, difficult to make mistakes.
* Source of the most space-saving and time-saving method: programming Pearl River
* @ Defgroup move_string
*@{
*/
# Include <stdio. h>
# Include <stdlib. h>
# Include <string. h>
/********************** The most time-saving method *********** *************/
/**
* @ Brief rotate the string to N positions on the left
* @ Param STR string to be rotated
* @ Param [in] number of rotations required by mov
* @ Return none
*/
Void move_string_left (char * STR, int mov)
{
If (null = STR | mov <= 0)
Return;
Char TMP [mov];
Int I;
Int Len = strlen (STR );
If (LEN = 0)
Return;
MoV % = Len;
If (mov = 0)
Return;
For (I = 0; I <sizeof TMP; I ++)
TMP [I] = STR [I];
TMP [I] = '\ 0 ';
For (I = 0; I <len-mov; I ++)
STR [I] = STR [I + mov];
For (; I <Len; I ++)
STR [I] = TMP [I-(LEN-mov)];
}
/**
* @ Brief rotate the string n places to the right
* @ Param STR string to be rotated
* @ Param [in] number of rotations required by mov
* @ Return none
*/
Void move_string_right (char * STR, int mov)
{
If (null = STR | mov <= 0)
Return;
Char TMP [mov];
Int I;
Int Len = strlen (STR );
If (LEN = 0)
Return;
MoV % = Len;
If (mov = 0)
Return;
For (I = len-mov; I <Len; I ++ ){
TMP [I-(LEN-mov)] = STR [I];
}
TMP [I-(LEN-mov)] = '\ 0 ';
For (I = len-1; I> = mov; I --){
STR [I] = STR [I-mov];
}
For (; I> = 0; I --)
STR [I] = TMP [I];
}
/********************** The most time-saving method *********** *************/
/*********************** the most space-saving method ******** * **************/
/**
* @ brief: rotate the string to the left by 1 position.
* @ Param STR string to be rotated
* @ Param [in] the number of mov to be rotated
* @ return none
*/
void move_string_one_left (char * str)
{< br> If (null = Str)
return;
int Len = strlen (STR);
int I;
If (LEN = 0)
return;
char TMP = STR [0];
for (I = 0; I STR [I] = STR [I + 1];
}< br> STR [I] = TMP;
}
/**
* @ brief rotate the string at one position to the right
* @ Param STR string to be rotated
* @ Param [in] mov required number of rotations
* @ return none
*/
void move_string_one_right (char * Str)
{< br> If (null = Str)
return;
int Len = strlen (STR);
If (LEN = 0)
return;
char TMP = STR [len-1];
int I;
for (I = len-1; I> 0; I --) {
STR [I] = STR [I-1];
}< br> STR [I] = TMP;
}< br>/************************ the most space-saving method **** * *******************/
/********************** One of the most space-saving and time-saving methods ******** ****************/
/**
* @ Brief returns the maximum common divisor of values I and J.
* @ Return: returns the maximum common divisor correctly. If the parameter is incorrect, return-1.
*/
Int gcd (int I, Int J)
{
If (I <= 0 | j <= 0)
Return-1;
While (I! = J ){
If (I> J)
I-= J;
Else
J-= I;
}
Return I;
}
/**
* @ Brief rotate the string to N positions on the left
* @ Param STR string to be rotated
* @ Param [in] number of rotations required by mov
* @ Return none
*/
Void move_string_fast_left (char * STR, int mov)
{
If (null = STR | mov <= 0)
Return;
Int Len = strlen (STR );
Char TMP;
If (! Mov)
Return;
MoV % = Len;
If (! Mov)
Return;
Int I, J, K;
Int g_cd = gcd (mov, Len );
For (I = 0; I <g_cd; I ++ ){
TMP = STR [I];
J = I;
While (1 ){
K = J + mov;
If (k> = Len)
K-= Len;
If (k = I)
Break;
STR [J] = STR [k];
J = K;
}
STR [J] = TMP;
}
}
/**
* @ Brief rotate the string n places to the right
* @ Param STR string to be rotated
* @ Param [in] number of rotations required by mov
* @ Return none
*/
Void move_string_fast_right (char * STR, int mov)
{
If (null = STR | mov <= 0)
Return;
Int Len = strlen (STR );
If (! Mov)
Return;
MoV % = Len; // number of mobile repairs
If (! Mov)
Return;
MoV = len-mov;
Move_string_left (STR, mov );
}
/********************** One of the most space-saving and time-saving methods ******** ****************/
/********************** Method 2 of the most space-saving and time-saving methods ******** ****************/
/**
* @ Brief refers to two elements whose lengths start from pos1 and start from pos2 and are num.
* Avoid out-of-bounds memory!
* @ Param STR string of some characters to be exchanged
* @ Param [in] starting position of the first part of pos1
* @ Param [in] starting position of the second part of pos2
* @ Param [in] num number of characters to be exchanged decompiled and cracked by limit exa
*/
Void swap_string (char * STR, int pos1, int pos2, int num)
{
Char * str1 = STR + pos1;
Char * str2 = STR + pos2;
Int I;
Char TMP;
For (I = 0; I <num; I ++ ){
TMP = * str1;
* Str1 = * str2;
* Str2 = TMP;
Str1 ++;
Str2 ++;
}
}
/**
* @ Brief rotate to the left using the method of switching elements (shift to the left of the loop)
* @ Param STR string to be rotated
* @ Param [in] number of rotations required by mov
* @ Return none
*/
Void move_string_swap_left (char * STR, int mov)
{
If (null = STR | mov <= 0)
Return;
Int Len = strlen (STR );
If (! Mov)
Return;
MoV % = Len; // number of mobile repairs
If (! Mov)
Return;
Int I = mov;
Int J = len-mov;
While (I! = J ){
If (I> J ){
Swap_string (STR, mov-I, mov, J );
I-= J;
}
Else {
Swap_string (STR, mov-I, mov-I + J, I );
J-= I;
}
}
Swap_string (STR, mov-I, mov, I );
}
/********************** Method 2 of the most space-saving and time-saving methods ******** ****************/
/*********************** the third method to save space and time ***** * *****************/
/**
* @ brief starts from start end-to-End characters are reversed
* @ Param STR string of some characters to be reversed
* @ Param [in] Start position
* @ Param [in] end position
* @ return none
*/
void reverse (char * STR, int start, int end)
{< br> char * pos1 = STR + start;
char * pos2 = STR + end;
char TMP;
while (pos1 TMP = * pos1;
* pos1 = * pos2;
* pos2 = TMP;
pos1 ++;
pos2 --;
}< BR >}
/**
* @ brief uses the reverse method to rotate the string to the left (loop to the left)
* @ Param STR string to be rotated
* @ Param [in] mov Number of strings to be rotated
* @ return none
*/
void move_string_reverse_left (char * STR, int mov)
{< br> If (null = STR | mov <= 0)
return;
int Len = strlen (STR );
If (! Mov)
return;
mov % = Len; // number of moves repaired
If (! Mov)
return;
reverse (STR, 0, mov-1);
reverse (STR, mov, len-1);
reverse (STR, 0, len-1 );
}< br>/************************* the third method to save space and time * * **********************/
/*** @} */
# If 1
int main (INT argc, char ** argv)
{< br> char STR [] = "Hello world! ";
int n = atoi (argv [1]);
int I;
move_string_reverse_left (STR, N );
printf ("% s \ n", STR);
return 0;
}< BR ># endif