首先题目是:
输入一个字符串和一个非负整数N,要求将字符串循环左移N次。
然后下面的输入和输出的格式就不在赘述了。
输入样例:
Hello World!
2
输出样例:
llo World!He
我的思路:因为自己写过数组向右循环移动的题目,然后学到了一个取余的特殊用法,如下所示:
所以就想着能不能把向左循环移动变为向右循环移动,在调试过后找到了这个规律;
从向左移动变为向右移动就是拿数组总长度减去向左移动的次数,就是向右移动的次数,分析出了这个思路后,下面的代码就变的简单了:
AC代码:
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{
char a[105],b[105]; //b为临时数组
int n; //n为向左移动的位数
gets(a);
scanf("%d",&n);
int m;
m = strlen(a);
int q;
if(n < m){
q = m - n; //q为向右移动的位数;题目要求向左移动n位,就相当于向右移动 数组总长度-向左移动的位数;
for(int i = 0;i < m ;i++){
b[(q + i ) % m] = a[i];
}
}else{
q = n % m;// 如果n > m,则用n对m取余,则得到左移的位数,然后再用数组总长度-左移的位数,就得到向右移动的位数了;
int p = m - q;
//printf("%d",q);
for(int i = 0;i < m;i++){
b[(p + i) % m] = a[i];
}
}
for(int i = 0;i < m;i++){
printf("%c",b[i]);
}
return 0;
}
需要注意的是,当输入的循环次数大于数组总长度时,这个时候要做一下处理,进行一下取余,就是向左循环的次数,然后拿数组总长度-向左循环的次数就是向右循环的次数了。