C语言(数组,DEVFORGE学编程社区)

Posted on 2019-09-19 23:30  金色的省略号  阅读(558)  评论(0编辑  收藏  举报

1、右下角

 1 #include <stdio.h>
 2 #include <malloc.h>
 3 int main()
 4 {
 5     int n;
 6     scanf("%d",&n);
 7     
 8     int *arr = (int*)malloc(sizeof(int)*n*n); //一维模拟二维数组
 9     
10     for(int a=0; a<n*n; ++a)
11     {
12         scanf("%d",&arr[a]);
13     }
14     
15     for(int i=0; i<n; ++i)
16     {
17         for(int j=0; j<n-i-1; ++j)//左上角输出空格
18         {
19             printf("  ");
20         }
21         for(int k=n-i-1; k<n; ++k)//右下角输出数组元素
22         {
23             printf("%d ",arr[i*n+k]);//模拟
24         }
25         printf("\n");
26     }
27 
28     return 0;
29 }

2、插入排序

 1 #include <stdio.h>
 2 #include <malloc.h>
 3 
 4 void InsertSort(int *arr, int m)
 5 {
 6     int i;
 7     for(i=1; i<m; ++i){/*第0个元素有序,从第1个元素向右无序*/
 8         int j=i-1,key=arr[i];/*保存第i个元素,左边的元素i-1*/
 9         while(j>=0 && key>arr[j]){/*保存的元素key与之前的元素从右向左逐个比较*/
10             arr[j+1]=arr[j];/*移动(向后赋值)*/
11             j--;
12         }
13         arr[j+1]=key;/*j--退出,恢复正确值j+1*/
14     }
15 }
16 
17 int main()
18 {
19     int n;
20     scanf("%d",&n);
21     
22     int *arr = (int*)malloc(sizeof(int)*n); 
23     
24     for(int i=0; i<n; ++i)
25     {
26         scanf("%d",&arr[i]);
27     }
28     
29     int s,m;
30     scanf("%d%d",&s,&m);
31     
32     InsertSort(&arr[s],m);
33     
34     for(int j=0; j<n; ++j)
35     {
36         printf("%d ",arr[j]);
37     }
38     
39     return 0;
40 }

3、边缘与内心的差

 1 #include <stdio.h>
 2 #include <malloc.h>
 3 int main()
 4 {
 5     int n,m,s1=0,s2=0;
 6     scanf("%d%d",&n,&m);
 7     
 8     int *arr = (int*)malloc(sizeof(int)*n*m); //一维模拟二维数组
 9     
10     for(int i=0; i<n*m; ++i)
11     {
12         scanf("%d",&arr[i]);
13     } 
14     
15     for(int i=0; i<n; ++i)
16     {
17         for(int j=0; j<m; ++j)
18         {
19             if(i==0||i==n-1 || (i!=0&&i!=n-1&&(j==0||j==m-1)))
20             {
21                 s1 += arr[i*m+j]; //一行m个
22             }
23             else
24             {
25                 s2 += arr[i*m+j];
26             } 
27         }      
28     }
29     
30     printf("%d ",s1-s2);
31     
32     return 0;
33 }

4、左下角

 1 #include <stdio.h>
 2 #include <malloc.h>
 3 int main()
 4 {
 5     int n;
 6     scanf("%d",&n);
 7     
 8     int *arr = (int*)malloc(sizeof(int)*n*n); //一维模拟二维数组
 9     
10     for(int a=0; a<n*n; ++a)
11     {
12         scanf("%d",&arr[a]);
13     }
14     
15     for(int i=0; i<n; ++i)
16     {
17         for(int j=0; j<i+1; ++j)//输出数组元素
18         {
19              printf("%d ",arr[i*n+j]);//模拟
20         }       
21         printf("\n");
22     }
23     return 0;
24 }

 5、快速排序

 1 #include <stdio.h>
 2 #include <malloc.h>
 3 
 4 void QuickSort(int *a, int left, int right)
 5 {
 6     int i,j,t;
 7     /*左指针left指向数组头 右指针right指向数组尾*/
 8     if(left<right){
 9         i=left,j=right,t=a[left];/*左右指针 提取基数*/
10         while(i<j){
11             while(i<j && a[j]<=t) j--;/*右指针左移 指向小于基数的数据停止*/
12                 a[i]=a[j]; /*补空位*/
13             while(i<j && a[i]>=t) i++;/*左指针右移 指向大于基数的数据停止*/
14                 a[j]=a[i]; /*补空位*/
15         }
16         a[j]=t;/*右指针指向数据即基数应在的位置 基数定位*/
17         QuickSort(a,left,j-1);/*左边数据递归*/
18         QuickSort(a,j+1,right);/*右边数据递归*/
19     }
20 }
21 
22 int main()
23 {
24     int n;
25     scanf("%d",&n);
26     
27     int *arr = (int*)malloc(sizeof(int)*n); 
28     
29     for(int i=0; i<n; ++i)
30     {
31         scanf("%d",&arr[i]);
32     }
33     
34     int s,m;
35     scanf("%d%d",&s,&m);
36     
37     QuickSort(arr,s,m); //左s,右m
38     
39     for(int j=0; j<n; ++j)
40     {
41         printf("%d ",arr[j]);
42     }
43     
44     return 0;
45 }

 6、二分查找

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #define N 100
 4 int BinarySearch ( int *arr, int n, int m);
 5 int main()
 6 {
 7     int n;
 8     scanf("%d",&n);
 9     int arr[N] = {0};
10     for(int i=0; i<n; ++i){
11         scanf("%d",&arr[i]);
12     }
13     int m;
14     scanf("%d",&m);
15     int ret = BinarySearch(arr,n,m);
16     if(ret!=-1)
17         printf("%d",ret);
18     else 
19         printf("null");
20     return 0;
21 }
22 int BinarySearch ( int *arr, int n, int m)
23 {
24     int left = 0, right = n-1, mid;
25     
26     while ( left <= right )
27     {
28         mid = (left+right)/2; /*计算中间元素坐标*/
29         if( m <arr[mid]) right = mid-1; /*调整右边界*/
30         else if( m>arr[mid]) left = mid+1; /*调整左边界*/
31         else return mid; /*查找成功,返回数据元素的下标*/
32     }
33     return -1; /*查找不成功,返回-1*/
34 }

7、一维数组加法

 1 #include<stdio.h>
 2 /*不考虑进位可以过OJ*/
 3 int main()
 4 {
 5     int A[100], B[100], C[100];
 6     int i, n;
 7     scanf("%d", &n);
 8     for(i=0;i<n;i++)
 9     {
10         scanf("%d", &A[i]);
11     }
12     for(i=0;i<n;i++)
13     {
14         scanf("%d", &B[i]);
15     }
16     for(i=0;i<n;i++)
17     {
18         C[i]=A[i]+B[i];
19         printf("%d ", C[i]);
20     }
21     printf("\n");
22     return 0;
23 }
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #define N 100
 4 
 5 int main()
 6 {
 7     int n;
 8     scanf("%d",&n);
 9     int a[N] = {0}, b[N] = {0}, c[N] = {0};
10     /* 两个数组赋值 */
11     for(int i=0; i<n; ++i){/*数字的最高位在数组的0下标*/
12         scanf("%d",&a[i]);
13     }
14     for(int j=0; j<n; ++j){
15         scanf("%d",&b[j]);
16     }
17     /* 两个数组相加到数组c */
18     int carry = 0, index = 0;
19     for(int j=n-1; j>=0; j--)/*从数字的最低位相加*/
20     {
21         int temp = a[j] + b[j] + carry;
22         c[index++] = temp%10;
23         carry = temp/10;/**< 进位 */
24     }
25     if(carry > 0)/*判断是否进位*/
26     {
27         c[index++] = carry;
28     }
29     /* 打印相加结果 */
30     for(int k=index-1; k>=0; --k)
31     {
32         printf("%d ",c[k]);
33     }
34     return 0;
35 }

8、平均值函数

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #define N 100
 4 double avg(int a[],int s, int e);
 5 int main()
 6 {
 7     int n;
 8     scanf("%d",&n);
 9     int a[N] = {0};
10     for(int i=0; i<n; ++i){
11         scanf("%d",&a[i]);
12     }
13     int s,e;
14     scanf("%d%d",&s,&e);
15     printf("%f",avg(a,s,e));
16     
17     return 0;
18 }
19 double avg(int a[],int s, int e)
20 {
21     double sum = 0;
22     for(int i=s; i<=e; ++i){
23         sum += a[i];
24     }
25     return sum/(e-s+1);
26 }

9、一维数组赋值

 1 #include<stdio.h>
 2 #include <string.h>
 3 #define N 100
 4 int main()
 5 {
 6     int n;
 7     int arr[N] = {0};
 8     scanf("%d",&n);
 9     /* 偷懒 直接输出了 */
10     for(int i=0; i<n; ++i){
11         scanf("%d",&arr[i]);
12         if(i%2)
13             printf("%d ",arr[i]);
14     }
15     return 0;
16 }

10、选择排序

 1 #include<stdio.h>
 2 #include <string.h>
 3 #define N 100
 4 
 5 void SelectionSort(int a[], int s, int m);
 6 int main()
 7 {
 8     int n;
 9     int arr[N] = {0};
10     scanf("%d",&n);
11     
12     for(int i=0; i<n; ++i){
13         scanf("%d",&arr[i]);
14     }
15     
16     int s,m;
17     scanf("%d%d",&s,&m);
18     
19     SelectionSort(arr,s,m);
20     for(int i=0; i<n; ++i){
21         printf("%d ",arr[i]);
22     }
23     
24     return 0;
25 }
26 void SelectionSort(int a[], int s, int m)
27 {
28     for(int i = s; i<m; ++i){
29         int max = a[i];/*降序*/
30         int index = i;
31         for(int j = i+1; j<=m; ++j){/*从i+1逐个比较*/
32             if(max<a[j]){ /*是否比后面的小*/
33                 max = a[j];
34                 index = j;
35             }                
36         }
37         if(index != i){/*找到了最大值才交换*/
38             a[index] = a[i];
39             a[i] = max;
40         }
41     }    
42 }