C :7-31 字符串循环左移 (20 分)

首先题目是:
输入一个字符串和一个非负整数N,要求将字符串循环左移N次。
然后下面的输入和输出的格式就不在赘述了。

输入样例:

Hello World!
2

输出样例:

llo World!He

我的思路:因为自己写过数组向右循环移动的题目,然后学到了一个取余的特殊用法,如下所示:
C :7-31 字符串循环左移 (20 分)

所以就想着能不能把向左循环移动变为向右循环移动,在调试过后找到了这个规律;

从向左移动变为向右移动就是拿数组总长度减去向左移动的次数,就是向右移动的次数,分析出了这个思路后,下面的代码就变的简单了:
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;
}

需要注意的是,当输入的循环次数大于数组总长度时,这个时候要做一下处理,进行一下取余,就是向左循环的次数,然后拿数组总长度-向左循环的次数就是向右循环的次数了。

上一篇:[POI2007]ZAP-Queries


下一篇:力扣 31. 下一个排列