PATB 1008
本篇描述三种解题代码供读者参考
第一种:使用大数组,控制输出,用截断的方法
不要犯笔者的错误,笔者一开始理解错了题意,想成了左移,已注释,也粘贴了上来
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int A[1000000000];
//下为左移
/*int main(int argc, char **argv){
int step = 0, count = 0;
scanf("%d %d",&count,&step);
for(int i = 0; i < count; i++){
scanf("%d",&A[i]);
}
int len = count + step;
for(int i = 0; i < step; i++){
A[count+i] = A[i];
}
for(int i = step; i < len; i++){
printf("%d",A[i]);
if(i!=len-1){
printf(" ");
}
}
}*/
int main(int argc, char **argv){
int count = 0, step = 0;
scanf("%d %d",&count,&step);
step = step % count;//过2,3数据点的关键
for(int i = 0; i < count; i++){
scanf("%d",&A[i + step]);
}
for(int i = 0; i < step; i++){
A[i] = A[count+i];
}
for(int i = 0; i < count; i++){
printf("%d",A[i]);
if(i!=count-1){
printf(" ");
}
}
}
注意笔者,一开始没有添加注释中所写的关键步骤,导致2,3数据点一直不过,下同,加上即可
第二种,矩阵转置的思路,(B,A)=(A^-1, B^-1 )^-1
#include <bits/stdc++.h>
using namespace std;
void reverse(int R[], int left, int right);
int main(int argc, char **argv){
int m, n;
scanf("%d %d", &n, &m);
int arr[n];
for(int i = 0; i < n; i++){
scanf("%d",&arr[i]);
}
m = m % n;
reverse(arr, 0, n-m-1);
reverse(arr, n-m, n-1);
reverse(arr, 0, n-1);
for(int i = 0; i < n-1; i++){
printf("%d ",arr[i]);
}
printf("%d",arr[n-1]);
return 0;
}
void reverse(int R[], int left, int right){
int i = left, j = right, temp;
while(i < j){
temp = R[i];
R[i] = R[j];
R[j] = temp;
i++;
j--;
}
}
第三种,其他网友参考答案,与笔者的第一种方法相反,控制输入,这种方法更巧妙一些
#include <cstdio>
#include <bits/stdc++.h>
using namespace std;
//在输入上下手,高招
int main(int argc, char **argv){
int m, n;
scanf("%d %d",&n,&m);
m = m % n;
int a[n];
for(int i = m; i <= n-1; i++){
scanf("%d ",&a[i]);
}
for(int i = 0; i<=m-1; i++){
scanf("%d",&a[i]);
}
for(int i = 0; i <n-1; i++)
printf("%d ",a[i]);
printf("%d",a[n-1]);
return 0;
}