输入一个字符串和一个非负整数N,要求将字符串循环左移N次。
输入格式:
输入在第1行中给出一个不超过100个字符长度的、以回车结束的非空字符串;第2行给出非负整数N。
输出格式:
在一行中输出循环左移N次后的字符串。
输入样例:
Hello World!
2
输出样例:
llo World!He
方法一:直接用字符数组实现(直观)
注意输入整数超过字符数组的长度,所以在用数组调成字符位置的时候不能直接用n调整,必须用n%s.lenth()
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
int main()
{
char c[101],a[101];
int len=0,i=0;
gets(c);
len=strlen(c);
int n,j=0;
cin>>n;
for(i=0;i<len;i++)
{
a[i]=c[i+n%len];
if(i>=len-(n%len))
while(j<=n%len)//将原数组开始的n%len的字符赋值给新的字符。
{
a[i]=c[j];
j++;
break;
}
}
for(int i=0;i<=len;i++)
cout<<a[i];
return 0;
}
方法二:循环链表,简单直接,建表找到起始输出位置就可以直接输出(建表分配的内存超出题目的限制,无法AC,发生段错误)
#include <iostream>
#include <string>
using namespace std;
typedef struct node{
char c;
int num;
struct node *next;
}*Link;
void initiate(Link L)
{
L=(Link)malloc(sizeof(node *));
L->next=L;
}
int create(Link L)//建表,返回字符的个数
{
initiate(L);
node *p,*q;
p=L;
char c0;
int i=0;
while((c0=getchar())!='\n')
{
q=(node*)malloc(sizeof(node));
q->c=c0;
q->num=i;
p->next=q;
p=q;
i++;
}
p->next=L->next;
return i-1;
}
void caculate(Link L,int n,int num)//计算
{
int i=num;
node *p;
p=L->next;
while(p->num!=n%i)//找到起始输出位置,就是让p->num==(左移位数对字符个数取余);
p=p->next;
cout<<p->c;//直接输出找到后的第一个字符
int count=0;
while(count<num)//从第二个字符开始,循环输出num个字符
{
p=p->next;
cout<<p->c;
free(p);
count++;
}
}
int main()
{
int n;
Link L;
int num=create(L);
cin>>n;
caculate(L, n,num);
return 0;
}