#include
#include
int main(){
int n,m;
scanf("%d%d",&n,&m);
int nums[n];
for(int i=0;i<n;i++){
scanf("%d",&nums[i]);
}
int flag=n-(m%n); //先打印的那个数字下标,因为m可能大于n所以要取余
for(int i=flag;i<n;i++){ //先打印flag数字和他后面的
printf("%d ",nums[i]);
}
for(int i=0;i<flag-1;i++){ //再打印前面的
printf("%d ",nums[i]);
}
printf("%d",nums[flag-1]); //最后一个不能带空格
return 0;
}
再放一个尝试的第二个方法:
因为看那个1 2 3 4 5 6变成5 6 1 2 3 4
不就是把5 6 连在一起,1 2 3 4 连在一起,然后把56放在1234前面嘛
所以我就想着用字符串操作
int main(){
int n,m;
scanf("%d%d",&n,&m);
char nums[n]; //定义成字符数组,这也是测试点为啥不能全过的原因
m=m%n; //m可能大于n
for(int i=0;i<n;i++){
scanf(" %c",&nums[i]); //小心多次scanf字符的陷阱
}
char *pre=(char *)malloc((sizeof(char))*(n-m));
strncpy(pre,nums,n-m); //以样例,pre用来指向1234 nums:1 2 3 4 5 6
strncpy(nums,nums+n-m,m); //然后把56放到12的位置 nums:5 6 3 4 5 6
strcpy(nums+m,pre);//再把1234放到3456的位置 nums:5 6 1 2 3 4
for(int i=0;i<n-1;i++)
printf("%c ",nums[i]);
printf("%c",nums[n-1]);
}
编程的时候遇到的一个问题是,我发现nums这个输入有问题,才想起来多次scanf %c会把回车也弄进去,所以要每次应该要清空缓冲区,有两种方式:scanf(" %c",&nums[i]);在%c前面加空格;或者scanf("%c",&nums[i]);getchar();在scanf后面加上getchar()
到此,提交到pta发现有两个测试点错误,思考良久,才想起来它有可能输入大于10的数,这样存储在数组里的时候只会存储第一位…
第三个方法就是最尝龟的了:
把前面和后面各自反转:1 2 3 4 5 6 -》 4 3 2 1 6 5
然后再总体反转:4 3 2 1 6 5 -》 5 6 1 2 3 4
void reverse(int nums[],int begin,int end){ //先写一个反转函数
int mid=(begin+end)/2;
for(int i=begin;i<=mid;i++){
int temp=nums[i];
nums[i]=nums[end+begin-i];
nums[end+begin-i]=temp;
}
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
int nums[n];
m%=n;
for(int i=0;i<n;i++)
scanf("%d",&nums[i]);
reverse(nums,0,n-m-1); //反转前半部分
reverse(nums,n-m,n-1); //反转后半部分
reverse(nums,0,n-1); //反转总体
printf("%d",nums[0]);
for(int i=1;i<n;i++)
printf(" %d",nums[i]);
return 0;
}
1.注意多次输入字符的问题
2.反转的时候比较绕,最好是代数进去验证