使用递增操作符的数组输入,比如说
int b[100],i=0;
while(cin>>a){
b[i++]=a;
}
//在这个代码中,i是从1开始存数的,也就是数的范围从b[1]开始,而不是0
对于排序,并且输出排序之后的角标的那种题,就可以看作
排序前
a[1]=12(数) | a[1]=1 | a[1]=16 | a[1]=19 | a[1]=54 |
b[1]=1(角标) | b[2]=2 | b[3]=3 | b[4]=4 | b[5]=5 |
排序后
a[1]=1 | a[2]=12 | a[3]=16 | a[4]=19 | a[5]=54 |
b[1]=2 | b[2]=1 | b[3]=3 | b[4]=4 | b[5]=5 |
就是在排序的过程中,数组里面的数交换,角标数组里面的数也换顺序
#include<bits/stdc++.h> using namespace std; #define N 15 int main(){ int a[N],b[N]; for(int i=1;i<=10;i++){ cin>>a[i]; b[i] = i; } for(int i=1;i<=10;i++){ for(int j=1;j<=10-i;j++){ if(a[j]>a[j+1]){ swap(a[j],a[j+1]); swap(b[j],b[j+1]); } } } for(int i=1;i<=9;i++){ cout<<a[i]<<' '; }cout<<a[10]; cout<<endl; for(int i=1;i<=9;i++){ cout<<b[i]<<' '; }cout<<b[10]; return 0; }
数列有序的问题
对于,在一个数列里面插入数,且按大小排列的问题,可以先将数存在a[0]里面,然后搞一个倒循环,如果数组里面的数比a[0]小,就向右移,让a[j+1]=m;
int n,m; while(cin>>n>>m){ if(n==0&&m==0) break; for(int i=1;i<=n;i++) cin>>a[i]; a[0]=m; int j; for(j=n;a[j]<m;j--){ a[j+1]=a[j]; } a[j+1]=m;//这个地方的处理还是比较巧妙的,到了m<a[]的时候,就让m插进去了
数组右移问题
输入:
5
3 6 2 5 8
输出:
3 6 2 5 8
8 3 6 2 5
5 8 3 6 2
2 5 8 3 6
6 2 5 8 3
#include<bits/stdc++.h> using namespace std; int a[1010]; int main() { int n, i, j, num[30]; scanf("%d", &n); for(i=0; i<n; i++) //这个是一次输入即输出的循环,代表了一种情况,就是和输入的相同的那一种 { scanf("%d", &num[i]); if(i==0) printf("%d", num[i]); else printf(" %d", num[i]); } printf("\n"); for(j=n-1; j>0; j--) //这个外层循环是用来控制输出次数的,也就是右移的位次,n=5,一共需要移动5次,除去原封不动的那一次已经输出,只需要输出剩下4次,
//因为右移就是把尾部一部分的数移到最左边 { for(i=j; i<n; i++) // 这个i=j表示需要移到最右边当头的那一个数,输出的时候前面不需要空格,在之后的循环,i!= j 的那个时候,分别移在头的右边 { if(i==j) printf("%d", num[i]); else printf(" %d", num[i]); } for(i=0; i<j; i++) //这个是处理i位之前数的输出的 printf(" %d", num[i]); printf("\n"); } return 0; }
数组逆序问题
与上一题异曲同工
#include<bits/stdc++.h> using namespace std; int a[1010]; int main() { int n,m; cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } cin>>m; for(int i=n-m+1;i<=n;i++){ cout<<a[i]<<' '; } for(int i=1;i<=n-m;i++){ cout<<a[i]<<' '; } return 0; }