解题思路:
第一种思路,将数组整体后移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分
27 人评分
#include<satdio.h> { int i,j,n,m,a[i]; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&a[i]); } scanf("%d",&m); for(i=0;i<n;i++) { if(i<m) { i++; a[i]=a[n-m+i]; } else { i++; a[i]=a[i-m]; } for(j=0;j<n;j++) { a[j]=a[i]; printf("%d",a[j]); } } return 0; } 请问我这个为什么不对呀?
我这个繁琐一点 #include<stdio.h> int main() { int n,a[20],m; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } scanf("%d",&m); fun(n,m,a); for(int i=0;i<n;i++) { printf("%d ",a[i]); } } void fun(int n,int m,int *p) { int b[20]; for(int i=0;i<n;i++) { b[i]=p[i]; } for(int i=0;i<m;i++) { p[i]=b[n-m+i]; } for(int i=0;i<n-m;i++) { p[i+m]=b[i]; } }
#include<iostream> using namespace std; int main() { int n; cin >> n; int arr[100]; for (int i = 0; i < n ; i++) { cin >> arr[i]; } int m; cin >> m; for (int i = n-m; i < n ; i++) { cout << arr[i]<<" "; } for (int i = 0; i < n - m; i++) { cout << arr[i] << " "; } } 控制输出顺序也可以吧
#include<stdio.h> int main() { int a[12]; int i; for(i=2;i<12;i++) { scanf("%d",&a[i]); } a[0]=0; a[1]=0; int w; w=a[10];a[10]=a[0];a[0]=w; w=a[11];a[11]=a[1];a[1]=w; for(i=0;i<10;i++) { printf("%d",a[i]); } } 为啥他说我答案错误
分糖果 (C++代码)浏览:855 |
C二级辅导-同因查找 (C语言代码)浏览:553 |
母牛的故事 (C语言代码)浏览:1427 |
用筛法求之N内的素数。 (C++代码)浏览:692 |
求圆的面积 (C语言代码)浏览:1665 |
简单的a+b (C语言代码)浏览:572 |
DNA (C语言代码)浏览:745 |
Pascal三角 (C语言代码)浏览:641 |
简单的a+b (C语言代码)浏览:460 |
C语言程序设计教程(第三版)课后习题5.6 (C语言代码)浏览:578 |