zoukankan      html  css  js  c++  java
  • 2019年第三周作业

    判断上三角矩阵

    1.实验代码

    复制代码

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 int main(int argc, char *argv[])
     4 {
     5     
     6     int n;
     7     int T;
     8     int a[10][10];
     9     scanf("%d", &T);
    10     int *b= (int*)malloc(sizeof(int)*T);
    11     int i,c,j;
    12 
    13     for (i = 0; i < T; i++)
    14     {
    15         scanf("%d", &n);
    16 
    17         for (j = 0; j < n; j++)
    18         for (c = 0; c < n; c++)
    19         {
    20             scanf("%d", &a[j][c]);
    21         }
    22 
    23         for (j = 1; j < n; j++)
    24         {
    25             for (c=0; c< n;c++)
    26             {
    27                 if (c < j&&a[j][c] == 0)
    28                     b[i] = 0;
    29                 if(c<j&&a[j][c]!=0)
    30                 {
    31                     b[i] = 1;
    32                     break;
    33                 }
    34             }
    35             if (b[i] == 1)
    36                 break;
    37         }
    38     }
    39     for (i = 0; i < T; i++)
    40     {
    41         if (b[i] == 0)
    42             printf("YES
    ");
    43         else
    44             printf("NO
    ");
    45     }
    46     return 0;
    47 }
    

    复制代码
    运行截图

    设计思路:

    1.先用T来储存有几个三角矩阵.

    2.输出矩阵,并且运用双循环和二维数组来判断小于i,j的数组元素是否为0.

    3.最后判断该是否为三角矩阵.

    本题调试过程及解决方案:没得问题.

    流程图:

    求最大子数组之和

    1.实验代码

    复制代码

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
        int i, n, max;
        FILE *fp;
    
        if ((fp = fopen("D:\编程\C\代码\PYozo", "a+")) == NULL)
        {
        exit(0);
        }
        fscanf(fp, "%d", &n);     //数组中有几个元素
    
        int *p = (int*)malloc(sizeof(int)*n);     //用动态分配储存数组里的元素
        char ch;
    
        for (i = 0; i < n; i++)
            {
            fscanf(fp, "%d%c", &p[i], &ch);
            }
        int j=0;
        int *sum = (int*)malloc(sizeof(int)*n);
        int *arr = (int*)malloc(sizeof(int)*n);
        sum[0] = p[0];
        max = sum[0];
        arr[0]=sum[0];
    
        for (i = 0; i < n; i++)
        {
            if (sum[i] >= 0&&i!=0)             //如果sum大于0则继续加,因为sum大于0有可能还会继续增加.
            {
                sum[i] = sum[i - 1] + p[i];
                arr[j] = p[i];
                j++;
                if (sum[i] > max)
                max = sum[i];
            }
    
            if (sum[i] < 0)               //如果sum小于0就不用管,因为这肯定不是最大的数.
            {
                j = 0;
                sum[i] = p[i];
                if (sum[i] > max)
                {
                    max = sum[i];
                    arr[j]=sum[i];
                }
                sum[i + 1] = p[i + 1];
                sum[i] = 0;
            }
        }
            fprintf(fp,"
    ");
    
        if(max>0)
        {
            i=0;
            sum[0]=0;
            while(1)
            {
                sum[0]+=arr[i];
                i++;
                if(sum[0]==max)
                    break;
            }
        }
    
        for (j = 0; j <i; j++)
            fprintf(fp,"%d ",arr[j]);
        fprintf(fp,"
    %d", max);
    
        fclose(fp);
    
        return 0;
    }
    
    }
    

    复制代码
    运行截图



    设计思路:
    1.运用malloc动态分配来创造一个数组p.

    2.在从下标0开始加,若是全为负数先将结果储存到数组里面在则会判断谁为最大负数,若是和为正数,那么它有可能增加也可能变少,通过判断将其保存在一个变量中,若和为负数,则将当前下标数组sum清0直接进行下次的递增.

    本题调试过程及解决方案:
    1.一开始想到的解题方式是想用枚举法的,但是听了dalao给我说了这道题涉及的算法,才写出了简便的代码。2.并且我也没有把和若为负数的情况考虑周到,使得显示出来的答案一直为16或者17,随即便找到了未将sum[i]重新赋值为0导致sum并没有从一个新的下标开始加.3.同时我也没考虑到若数组全为负数怎么办,到后面尝试了一下发现只要加两条代码sum[i+1]=p[i+1];sum[i]=0;即可。

    二:学习进度:

    学习感悟:
    发现知道的越多不懂的也就越多,所以要更加努力的学习

  • 相关阅读:
    海报
    mailto
    tab+tab
    tab22
    tab
    line-height属性详解
    vertical-align属性详解
    窗口关系及框架、窗口位置、窗口大小、导航和打开窗口
    cursor属性
    深入了解css3新特性
  • 原文地址:https://www.cnblogs.com/txtnb/p/10536867.html
Copyright © 2011-2022 走看看