标题数组循环右移问题:
对于初学编程的同学来说,数组是一个让人头疼的东西,但是对于编程来说,数组可是一个好东西。熟练运用后,可以解决很多有趣的问题。这里我给大家讲一下初学者都会遇到的一个编程题:数组循环右移问题。多数同学可能会考虑不到一些特殊的情况,例如移动的长度大于数组原来的长度,又或是在处理数组边界问题上苦苦思索,今天咱就给大家一一解开疑惑。
首先输入给出输入长度(L)和移动长度(s)。我们不能形成固定思维,就因为例子而认为移动长度一定小于数组长度。移动长度还有可能是大于数组长度的。这时候我们就需要将移动长度变为“真移动长度”——s=s%L;因为当移动的长度s大于数组L时,我们这里就可以取s相对于L的余数了,这里是为了保证我们用的s是小于L的,这样就可以知道具体要移动多少位了。当我们用一个数组输出时,因为输出要分两块进行输出(1.从中间开始,2.从头开始),若不进行判断,则对于输出时的空格是不好控制的,但如果我们换个思路,将所有的元素按输出顺序均移动到一个新的数组,这样对于数组中的空格我们就好判断了。话不多说,附代码:
#include<stdio.h>
#define max 100
int main()
{
int s,l,a[max],t=0,b[max];
scanf("%d%d",&s,&l);
l=l%s;
for(int i=0;i<s;i++)
scanf("%d",&a[i]);
for(int i=s-l;i<s;i++)
b[t++]=a[i];
for(int i=0;i<s-l;i++)
b[t++]=a[i];
for(int i=0;i<s;i++)
{
if(i!=0)
printf(" ");
printf("%d",b[i]);
}
return 0;
}
这是使用了两个数组的方法。那么请大家想一想如何使用一个数组就将这道题做出来。附代码。
#include<stdio.h>
#define max 100
int main()
{
int s,l,a[max],t=0,b[max];
scanf("%d%d",&s,&l);
l=l%s;
for(int i=0;i<s;i++)
scanf("%d",&a[i]);
for(int i=s-l;i<s;i++)
{
if(i!=(s-l))
printf(" ");
printf("%d",a[i]);
}
for(int i=0;i<s-l;i++)
{
if(l==0)
{
if(i!=0)
printf(" ");
printf("%d",a[i]);
}
else
{
printf(" ");
printf("%d",a[i]);
}
}
return 0;
}
最后,希望大家有什么建议能提出来,谢谢阅读。