80 likes | 199 Views
70011 对一个 有序的数组 , 输入一个整数 x, 把 x 插入到这组数据中 , 使该组数据仍然有序. 输入 n,a,x. 例 数组 a: 1 3 5 7 9 插入 6. a[n-1]<x. i=0. a[n]=x. 解法 1. a[i]<x. 找到插入数的位置 插入数位置后的数后移 插入数. i++. j=n-1,n-2,…i. a[j+1]=a[j]. 1 3 5 7 9. j. a[i]=x. 1 3 5 7 7 9. 1 3 5 6 7 9. 输出 a. #include <stdio.h> void main()
E N D
70011 对一个有序的数组,输入一个整数 x,把 x 插入到这组数据中,使该组数据仍然有序 输入n,a,x 例 数组a: 1 3 5 7 9 插入 6 a[n-1]<x i=0 a[n]=x 解法1 a[i]<x 找到插入数的位置 插入数位置后的数后移 插入数 i++ j=n-1,n-2,…i a[j+1]=a[j] 1 3 5 7 9 j a[i]=x 1 3 5 7 7 9 1 3 5 6 7 9 输出a
#include <stdio.h> void main() {int i,j,n,x,a[100]; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); scanf("%d",&x); if(a[n-1]<x) a[n]=x; else {i=0; while(a[i]<x)i++; for(j=n-1;j>=i;j--) a[j+1]=a[j]; a[i]=x; } for(i=0;i<=n;i++) printf("%d ", a[i]); } 输入n,a,x a[n-1]<x i=0 a[n]=x a[i]<x i++ j=n-1,n-2,…i a[j+1]=a[j] j a[i]=x 输出a
解法2 1 3 5 7 9 1 3 5 6 9 1 3 5 6 7 9 找到插入数的位置 插入数与找到位置上交换 6 7 #include <stdio.h> void main() {int i,n,x,a[100],t; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); scanf("%d",&x); for(i=0;i<n;i++) if(a[i]>x) {t=a[i];a[i]=x;x=t;} a[n]=x; for(i=0;i<=n;i++) printf("%d ", a[i]); } 输入n,a,x i=0,1,…n-1 a[i]>x t=a[i] a[i]=x x=t i a[n]=x 输出a
解法3 1 3 5 7 9 6 1 3 5 7 6 9 1 3 5 6 7 9 插入数存入数组的最后 从后起两两相比交换位置 #include <stdio.h> void main() {int i,n,x,a[100],t; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); scanf("%d",&x); a[n]=x; for(i=n-1;i>=0;i--) if(a[i+1]<a[i]) {t=a[i+1];a[i+1]=a[i];a[i]=t;} for(i=0;i<=n;i++) printf("%d ", a[i]); } 输入n,a,x a[n]=x i=n-1,n-2,..0 a[i+i]>a[i] t=a[i+1] a[i+1]=a[i] a[i]=t i 输出a
1 输入a k=1;k<n;k++ i=0;i<n;i++ 0 a[row][col]>a[k][col] col=0 1 j=1;j<n;j++ row=k 0 a[i][col]<a[i][j]) k 1 0 row==i col=j 1 输出i,col j 停 row=0 i 1 输出NO 70026找矩阵的鞍点(元素值在该行上最大, 在该列上最小) 解法一: 1.固定i行,在i行找到最大元素的列j=>col 2.在col列找到最小元素的行k=>row 3.如i==row,则鞍点为row行col列 void main() {int i,j,k,row,col,flag=0,n; int a[6][6]; scanf("%d",&n); for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&a[i][j]); for(i=0;i<n;i++) {col=0; for(j=1;j<n;j++) if(a[i][col]<a[i][j])col=j; row=0; for(k=1;k<n;k++) if(a[i][col]>a[k][col])row=k; if(row==i) {flag=1;break;} } if(flag) printf("i=%d,j=%d",row,col); else printf("NO"); }
…… …… aij …… …… 解法二: 对每个元素判别是否鞍点 1.固定i行j列的元素aij 2.对i行求出列最大值max 3.对j列求出列最小值min 4.若 max==min==aij 则鞍点为i行j列 #include "stdio.h" int main(void) {int flag, i, j, k, n,row,col,max, min; int a[6][6]; scanf("%d", &n); for(i = 0; i < n; i++) for(j = 0; j < n; j++) scanf("%d", &a[i][j]); flag=0; for(i=0;i<n;i++) for(j=0;j<n;j++) {max=a[i][0]; for(k=1;k<n;k++) if(max<a[i][k]) max=a[i][k]; min=a[0][j]; for(k=1;k<n;k++) if(min>a[k][j]) min=a[k][j]; if(max==min&&max==a[i][j]) {flag=1;row=i;col=j; goto ll;} } ll: if(flag != 0) printf("a[%d][%d] = %d\n", row, col,a[row][col]); else printf("NO\n"); }
maxj max 例 1 7 4 1 4 8 3 6 1 6 1 2 0 7 8 9 1 1 1 3 7 8 6 0 mixi 3 2 2 0 0 6 1 1 max[2]=6 i=2 maxj[2]=1 == j min[1]=6 j=1 mini[1]=2 == i 解法三: 1.求出每行的最大值, 并记住行列 max[n-1] maxj[n-1] max对应的下标 最大值 列位置 行位置 2.求出每列的最小值, 并记住行列 min[n-1] mini[n-1] min对应的下标 最小值 行位置 列位置 3.若 max[i]==min[j] (i为行,j为列) 并 maxj[i]==j mini[j]==i 则鞍点为i行j列 min
#include<stdio.h> void main() {int n,i,j; int a[6][6],max[6],maxj[6]; int min[6],mini[6]; scanf("%d",&n); for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&a[i][j]); for(i=0;i<n;i++) {max[i]=a[i][0]; maxj[i]=0; for(j=1;j<n;j++) if(max[i]<a[i][j]) {max[i]=a[i][j];maxj[i]=j;} } for(j=0;j<n;j++) {min[j]=a[0][j]; mini[j]=0; for(i=1;i<n;i++) if(min[j]>a[i][j]) {min[j]=a[i][j];mini[j]=i;} } for(i=0;i<n;i++) for(j=0;j<n;j++) if(max[i]==min[j]&&maxj[i]==j &&mini[j]==i) {printf("%d %d\n",i,j); return; } printf("no\n"); }