// MemoryMovingAlgroithms.cpp :
//name:内存变量移动算法
//MainFunction:LeftMemoryMove(*thestring被移动的字符串,keylength需要移动的字符串的位数,m:左移位数)
//StatlitesFunction1:gcd(m,n)
//StatlitesFunction2:swap(*m,*n)
//StatlitesFunction3:RightMemoryMove(int *thestring,int keylength,int m);
//StatlitesFunction4;MemoryMove(int *thestring;int Keylength,int m)
//Data:2007,1,21.
//All rigths :HeLu.EEI
#include "stdafx.h"
#include "stdlib.h"
extern int gcd(int m,int n){
if (m<n)
return gcd(n,m);
else{
int tmp=m%n;
while(tmp!=0){
m=n;n=tmp;tmp=m%n;
}
}
return n;//unit test 1 passed
}
extern void swap(int *m,int *n){
int tmp=0;tmp=*m;*m=*n;*n=tmp;
}//unti test2 passed
extern void LeftMemoryMove(int *thestring,int keylength,int m){
//*thestring被移动的字符串;keylength需要移动的字符串的位数;m:左移位数
int i=0;int tmp=0;int j=0;
m=m%keylength;
if (m==0) return;//all move
else{
m=keylength-m;
tmp=gcd(keylength,m);
if (tmp==1){do{i=(m+i)%keylength;
swap(thestring,thestring+i);
}while(i!=0);
}
else{
for(i=0;i<tmp;i++){
j=i;
do{j=(j+m)%keylength;
swap(thestring+i,thestring+j);
}while(j!=i);
}
}
}
return;
}//unit test 3 passed
extern void RightMemoryMove(int *thestring,int keylength,int m){
int i=0;int tmp=0;int j=0;
m=m%keylength;
if (m==0) return;
else{
tmp=gcd(keylength,m);
if(tmp==1){do{i=(m+i)%keylength;
swap(thestring,thestring+i);
}
while(i!=0);
}
else{for(i=0;i<tmp;i++){
j=i;
do{j=(j+m)%keylength;
swap(thestring+i,thestring+j);
}while(j!=i);
}
}
}
return;
}//unit test4 passed
extern void MemoryMove(int *thestring,int keylength,int m,int flag){
//flag为0:左移;flag非0;右移
if(flag==0) LeftMemoryMove(thestring,keylength,m);
else RightMemoryMove(thestring,keylength,m);
}
int _tmain(int argc, _TCHAR* argv[])
{ //unit test 1
/*printf("gcd (12,15) is %d",gcd(12,15));
printf("gcd (15,12) is %d",gcd(15,12));*/
//unit test 2
/*int m=1;int n=2;int *p=&m;int *q=&n;
swap(p,q);
printf("the swaped m=1,n=2 is %d,%d",m,n);*/
//unit test 3
/*int a[6]={0,1,2,3,4,5};
int b[6]={0,1,2,3,4,5};
int c[10]={0,1,2,3,4,5,6,7,8,9};
LeftMemoryMove(a,6,3);
LeftMemoryMove(b,6,5);
LeftMemoryMove(c,10,4);
printf("a[6]={0,1,2,3,4,5} LeftMemoryMove 3 is :");
for(int i=0;i<6;i++){
printf("%d,",a[i]);
}
printf("/nb[6]={0,1,2,3,4,5} LeftMemoryMove 5 is :");
for (int i=0;i<6;i++){
printf("%d,",b[i]);
}
printf("/nc[10]={0,1,2,3,4,5,6,7,8,9} LeftMemoryMove 4 is:");
for (int i=0;i<10;i++){
printf("%d,",c[i]);
}*/
//unit test4
/*int a[6]={0,1,2,3,4,5};
int b[6]={0,1,2,3,4,5};
int c[10]={0,1,2,3,4,5,6,7,8,9};
RightMemoryMove(a,6,3);
RightMemoryMove(b,6,1);
RightMemoryMove(c,10,4);
printf("a[6]={0,1,2,3,4,5} rMemoryMove 3 is :");
for(int i=0;i<6;i++){
printf("%d,",a[i]);
}
printf("/nb[6]={0,1,2,3,4,5} rMemoryMove 1 is :");
for (int i=0;i<6;i++){
printf("%d,",b[i]);
}
printf("/nc[10]={0,1,2,3,4,5,6,7,8,9} rMemoryMove 4 is:");
for (int i=0;i<10;i++){
printf("%d,",c[i]);
}*/
system("PAUSE");
return 0;
}