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