解题思路:
第一种思路,将数组整体后移k位,然后让超出的部分回到首部。
大概是这样的
【1】【2】【3】【4】【5】【6】【7】【8】【9】【10】【】【】
【】【】【1】【2】【3】【4】【5】【6】【7】【8】【9】【10】//整体后移
【9】【10】【1】【2】【3】【4】【5】【6】【7】【8】【】【】//越界回归
这个做法的缺点是需要额外的数组空间,而且代码量多。
参考代码:
#include <stdio.h> int main() { int i,j=0; int x,n; int p[1007]={0}; scanf("%d",&n); for(i=0;i<n;i++){ scanf("%d",&p[i]); } scanf("%d",&x); for(i=x+n-1;i>=0;i--){//全部移动x位 p[i]=p[i-x]; } j=n; for(i=0;i<x;i++,j++){ p[i]=p[j]; } for(i=0;i<n;i++){ printf("%d ",p[i]); } return 0; }
第二种做法是使用取余判断。
以题目数据为例
10
1 2 3 4 5 6 7 8 9 10
2
最后的结果为
9 10 1 2 3 4 5 6 7 8
也就是说在第9位置上的“9”来到了第1号位置,第10位置的“10”来到了第二号的位置,其他的数全部向后移动了两位。
向后移动两位就是下标+2来实现,而对于9号位10号位+2以后会变成11和12,超出数组范围,他们应该在1号和2号才对。
取余操作恰好可以实现这一点,11%10=1 12%10=2。对于超出了多少,就会回到多少,11号超出了1个位置,就会回到1位置。
这个代码的缺点是使用了额外的空间,优点是代码量少。
代码实现如下:
#include <bits/stdc++.h> using namespace std; int main(){ int n,k; int p[1007],s[1007]; cin>>n; for(int i=0;i<n;i++){ cin>>p[i]; } cin>>k;//需要移动多少位 for(int i=0;i<n;i++){ s[(i+k)%n]=p[i];//核心代码,取余归位 } for(int i=0;i<n;i++){ cout<<s[i]<<" ";//打印输出 } return 0; }
第三种方法,通过调整输出顺序,来实现直接打印,核心也是第二种的取余的操作。
优点是代码量少,不需要额外的空间,缺点是只适用于竞赛和一些oj判题,数组内的存放还是之前输入的样子,不适用于面试等。
参考代码:
#include <bits/stdc++.h> using namespace std; int main(){ int n,k; int p[1007],s[1007]; cin>>n; for(int i=0;i<n;i++){ cin>>p[i]; } cin>>k;//需要移动多少位 for(int i=0;i<n;i++){ cout<<p[(i+n-k)%n]<<" "; //核心代码 } return 0; }
0.0分
180 人评分
#include<stdio.h> #include<math.h> int main() { int i; int m,n; int x[100]; int y[100]; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&x[i]); } scanf("%d",&m); shift(x,y,n,m); printf("\n"); return 0; } int shift(int x[],int y[],int n,int m); int shift(int x[],int y[],int n,int m) { int i; for(i=0;i<n;i++) { y[i+m]=x[i]; if((i+m)>n-1) { y[abs(i+m-n)]=y[i+m]; } } for(i=0;i<n;i++) { printf("%d ",y[i]); } } 做了好久,呜呜呜
#include <stdio.h> void sort(int* p,int* w, int n,int m) { int c = 0; for (int i = n - m; i < n; i++) { *w++ = *(p + i); } for (int i = 0; i < n - m; i++) { *w++ = *(p + i); } } int main() { int n; scanf("%d", &n); int arr[1000] = { 0 } ,ar[100] = { 0 } ; int c = 0,m; for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } scanf("%d", &m); sort(arr,ar, n,m); while (ar[c] != 0) { printf("%d ", ar[c++]); } return 0; }
#include<stdio.h> int main() { int n,m; scanf("%d",&n); int a[1007]; for(int i=0;i<n;i++) scanf("%d",&a[i]); scanf("%d",&m); for(int i=n-m;i<n;i++) printf("%d ",a[i]); for(int i=0;i<n-m;i++) printf("%d ",a[i]); return 0; }
#include<stdio.h> void houyi(int a[],int m,int n) { int b=0; int temp[m]; for(int i=0;i<m-n;i++) { temp[i+n]=a[i]; } for(int j=m-n;j<m;j++) { temp[b]=a[j]; b++; } for(int i=0;i<m;i++) { printf("%d ",temp[i]); } } int main() { int m,n; scanf("%d%d",&m,&n); int a[m]; for(int i=0;i<m;i++) { scanf("%d",&a[i]); } houyi(a,m,n); return 0; }大神,这为什么不对?
#include<stdio.h> int main(void) { int n; int arr[1008]={0}; int x; scanf_s("%d", &n); for (int i = 0; i < n; i++) scanf("%d", &arr[i]); scanf("%d", &x); for (int i = x; i < n ; i++) printf("%d ", arr[i]); for (int i = 0; i < x; i++) printf("%d ", arr[i]); return 0; }
李俊毅 2023-11-01 20:02:27 |
不对你发出来干嘛
#include<stdio.h> int main(void) { int n; int arr[1008]={0}; int x; scanf_s("%d", &n); for (int i = 0; i < n; i++) scanf_s("%d", &arr[i]); scanf_s("%d ", &x); for (int i = x; i < n ; i++) { printf("%d ", arr[i]); } for (int i = 0; i < x; i++) { printf("%d ", arr[i]); } return 0; }
dotcpp0586343 2023-09-15 14:35:23 |
#include<stdio.h> int main(void) { int n; int arr[1008]={0}; int x; scanf_s("%d", &n); for (int i = 0; i < n; i++) scanf("%d", &arr[i]); scanf("%d", &x); for (int i = x; i < n ; i++) printf("%d ", arr[i]); for (int i = 0; i < x; i++) printf("%d ", arr[i]); return 0; }
#include<stdio.h> void change(int a[100],int n,int m) { int i,k; printf("%d",a[n-m]); for(k=1;k<m;k++) { printf(" %d",a[n-m+k]); } for(k=0;k<n-m;k++) { printf(" %d",a[k]); } } int main() { int a[100]; int i,n,m; scanf("%d",&n); scanf("%d",&a[0]); for(i=1;i<n;i++) { scanf(" %d",&a[i]); } scanf("%d",&m); change(a,n,m); return 0; }
alex 2023-11-27 17:03:44 |
vocal 有点东西啊
void Order(int arr1[], int arr2[], int m, int n) { int i = 0; int j = 0; for (i = n - m; i < n; i++) { arr2[j] = arr1[i]; j++; } for (i = 0; i < n - m; i++) { arr2[j] = arr1[i]; j++; } } int main() { int n = 0; int m = 0; int i = 0; int arr1[10] = { 0 }; int arr2[10] = { 0 }; scanf("%d", &n); for (i = 0; i < 10; i++) { scanf("%d", &arr1[i]); } scanf("%d", &m); Order(arr1, arr2, m, n); for (i = 0; i < n; i++) { printf("%d ", arr2[i]); } return 0; }
一元一次方程 (C语言代码)浏览:4058 |
C语言程序设计教程(第三版)课后习题8.6 (C语言代码)浏览:585 |
C语言程序设计教程(第三版)课后习题9.8 (C语言代码)浏览:518 |
C语言程序设计教程(第三版)课后习题10.1 (C语言代码)浏览:759 |
C语言程序设计教程(第三版)课后习题10.1 (C++代码)浏览:497 |
简单的a+b (C语言代码)浏览:244 |
2005年春浙江省计算机等级考试二级C 编程题(1) (C语言描述if-else if语句)浏览:1057 |
简单的a+b (C语言代码)浏览:503 |
蛇行矩阵 (Java代码)浏览:661 |
C语言程序设计教程(第三版)课后习题1.6 (C语言代码)浏览:855 |