珠玉のプログラミング 2.3「基本操作の繰り返し・組み合わせ」で解く
p.16に紹介されている「お手玉の方法」を実装.
相変わらず理解するまでに時間かかったけれど,一度理解できると納得
一時変数をひとつしか用意しない.
配列の大きさの剰余を取ることによって,回転サイズの範囲に収まるようにひとつずつずらすのがコツ
(言葉で説明するのは至難)
#include <stdio.h> int main(void){ char array[] = "abcdefg"; int array_size = 7; int rotation_size = 3; int i, j; char tmp; i = 0; tmp = array[i]; do{ while(i + rotation_size < array_size){ array[i] = array[i + rotation_size]; i += rotation_size; } j = (i + rotation_size) % array_size; if( j == 0){ array[i] = tmp; }else{ array[i] = array[j]; } i = j; }while(i != 0); for(j = 0; j < array_size; j++){ printf("%c ", array[j]); } printf("\n"); return 0; }