美文网首页
天花板编程手把手计划-第一期-第一天-打卡

天花板编程手把手计划-第一期-第一天-打卡

作者: 4644f2f5191a | 来源:发表于2017-04-21 16:33 被阅读0次

    题目

    给出任意一个N*N的矩阵,将里面的数字按照从左上到右下有小到大排序,之后计算出新矩阵对角线上的数字总和(每个位置只参与一次计算)。例如:


    给出左边这个矩阵,先把它转换成右边的矩阵,之后计算对角线上的数字之和:1 + 5 + 9 + 3 + 7 = 25

    解题思路

    首先,获取N,然后用一维数组获取数据,并进行排序。因为后面要用到计算,所以需要转化成二位数组,关系为arr1[i][j]=arr[num*i+j]
    其次,找到计算的规律,即i=j和(a+b+1)==num)&&(a!=b),最后输出。定义两个函数sort()用来排序,count()用来计算。

    源代码

    #include <stdio.h>
    #define MAX 10001
    int num;
    int sum=0;
    int arr[MAX];
    int arr1[MAX][MAX];
    void sort()
    {
        int i,j;
        for(i=0;i<num*num;i++)
        {
            for(j=0;j<num*num-i-1;j++)
            {
                if(arr[j]>arr[j+1])
                {
                    arr[j]+=arr[j+1];
                    arr[j+1]=arr[j]-arr[j+1];
                    arr[j]=arr[j]-arr[j+1];
                }
            }
        }
    }
    void count()
    {
        
        for(int a=0;a<num;a++)
        {
            for(int b=0;b<num;b++)
            {
                if(a==b)
                {
                    sum+=arr1[a][b];
                }
                else if(((a+b+1)==num)&&(a!=b))
                {
                    sum+=arr1[a][b];
                }
            }
        }
    
    }
    void main()
    {
        int i,j;
        scanf("%d",&num);
        for(i=0;i<num*num;i++)
        {
            scanf("%d",&arr[i]);
        }
        sort();
        printf("\n");
        for(i=0;i<num;i++)
        {
            for(j=0;j<num;j++)
            {
                printf("%d ",arr[num*i+j]);
                arr1[i][j]=arr[num*i+j];
            }
            printf("\n");
        }
        count();
        printf("%d\n",sum);
    }
    

    执行结果

    Paste_Image.png

    总结

    主要注意一维数组和二维数组的转换,排序算法的写法和计算的规律。

    相关文章

      网友评论

          本文标题:天花板编程手把手计划-第一期-第一天-打卡

          本文链接:https://www.haomeiwen.com/subject/ldwdzttx.html