题目--求一个数组的最大子数和和最大子数组 及 判断上三角矩阵

2019年春季学期第三周做业:

第一题:

给定一个整数数组(包含正负数),找到一个具备最大和的子数组,返回其最大的子数组的和。

例如:[1, -2, 3, 10, -4, 7, 2, -5]的最大子数组为[3, 10, -4, 7, 2]
输入:
请创建以本身英文名字命名的txt文件,并输入数组元素数值,元素值之间用逗号分隔。
输出
在不删除原有文件内容的状况下,将最大子数组以及子数组的和写入文件。

 

关于这个题目,我先用C++把解题的算法写了出来,先发解题算法,便于理解,接下来再发利用文件输入输出后的整段代码。c++

代码1:算法

 1 #include<bits/stdc++.h>
 2 using namespace std;  3 int main (int argc,const char * argv[])  4 {  5     int arr[100];//先定义一个整形数组  6     int n,t,x;//t是最大子数和数组终止下标,X是起始下标  7     cin>>n;//输入数组元素数量  8     for(int i=0;i<n;i++)cin>>arr[i];//赋值  9     int ans=0,maxs=0;//定义一个字数和,和最大字数和 10     for(int i=0;i<n;i++)//遍历全部元素 11  { 12         ans+=arr[i];//累加每一个元素 13         if(ans>maxs){t=i;maxs=ans;}//若是ans大于maxs,证实此时仍是一个连续的最大和子数组,而且用maxs标记该值 14         if(ans<0){ans=0;x=i+1;}//若是ans小于0,则证实此时必定小于以前的子数和,直接从i+1个下标开始找下一个最大子数和数组 15  } 16     for(int i=x;i<=t;i++)//输出连续的最大子数和数组 17     cout<<arr[i]<<" "; 18     return 0; 19 }

 

下面这段代码是用C语言来利用文件完成输入输出,而且将须要的数值写入文件:(因为解题算法代码中已解释,该处代码简单标注一下,很少作解释)数组

 1 #include<bits/stdc++.h>
 2 
 3 #define MAXN 10000
 4 int main ( int argc , const char * argv[])  5 {  6     FILE * FP;  7     ((FP=fopen("D:\\zdzsh.txt","a+"))==NULL)?printf("fail\n"):printf("OK!\n");  8     int arrs[MAXN],n;  9     scanf("%d",&n); 11     for(int i=0;i<n;i++){ 12         fscanf(FP,"%d,",&arrs[i]);//从文件读入整形数值和用来分离的逗号 13  } 14     int ans=0,maxs=0,t,x; 15     for(int i=0;i<n;i++) 16  { 17         ans+=arrs[i]; 18         if(ans>maxs){t=i;maxs=ans;} 19         if(ans<0){ans=0;x=i+1;} 20  } 21     for(int i=0;i<n;i++)printf("%d ",arrs[i]); 22     printf("\n"); 23     
24     FP=fopen("D:\\zdzsh.txt","a+");//因为直接从文件读入数据,文件指针须要重置到最前方才能继续写入数据 25     fprintf(FP,"\n"); 26     for(int i=x;i<=t;i++){printf("%d ",arrs[i]);fprintf(FP,"%d ",arrs[i]);} 27     printf("\n%d",maxs); 28     fprintf(FP,"\n%d",maxs); 29     
30  fclose(FP); 31     return 0; 32 }

 

设计思路

 

本题调试过程当中遇到的问题及解决方法

因为以前文件指针一直没有重置,致使反复试没法将数据输入至文件当中.只需再次输入绝对路径重置文件指针便可。学习

 

运行结果截图

 

 第二题:

7-1 判断上三角矩阵 (15 分)spa

上三角矩阵指主对角线如下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。设计

本题要求编写程序,判断一个给定的方阵是否上三角矩阵。指针

输入格式:

输入第一行给出一个正整数T,为待测矩阵的个数。接下来给出T个矩阵的信息:每一个矩阵信息的第一行给出一个不超过10的正整数n。随后n行,每行给出n个整数,其间以空格分隔。调试

输出格式:

每一个矩阵的判断结果占一行。若是输入的矩阵是上三角矩阵,输出“YES”,不然输出“NO”。code

输入样例:

2
3
1 2 3
0 4 5
0 0 6
2
1 0
-8 2

 

输出样例:

YES NO

 

本题目比较容易,只要不粗心,通常一遍过..注意须要遍历的范围便可。blog

代码:

 1 #include <bits/stdc++.h>
 2 #define MAXN 101
 3 using namespace std;  4 int num_jz[MAXN][MAXN]={0};//初始化二维数组  5 int main(int argc,const char * argv[])  6 {  7     int T,n;  8     cin>>T;//T组数据  9     while(T--){ 10         int flag=0; 11         cin>>n;//n行n列 12         for(int i=0;i<n;i++){ 13             for(int j=0;j<n;j++){ 14                 cin>>num_jz[i][j]; 15  } 16  } 17         for(int i=0;i<n;i++){ //遍历范围 18             for(int j=0;j<i;j++){ 19                 if(num_jz[i][j]!=0){flag=1;break;} 20  } 21  } 22         if(flag==0)cout<<"YES"<<endl; 23         else cout<<"NO"<<endl; 24  } 25         return 0; 26 }

 

设计思路

 

本题调试过程当中遇到的问题及解决方法

遍历范围出现问题,遍历超出了所须要判断的范围。其他无大问题。

 

运行结果截图

 

 

 

自我评价:这次题目难度不是很高,但写的过程当中还有不少粗心的地方,致使一些简单的地方卡住,仍是但愿下次本身能认真点写...

 

学习总结:

学习总结: 存在的问题 心得 完成做业消耗时间 本周学习内容
  对文件读取数据的运用不是很熟练 多去看关于刷题的书籍,有助于提升本身写题能力,实在不会的能够参考大佬的代码,加以本身理解以后去默写几遍 半小时左右 文件输入,BFS,DFS,PARTITION算法及简单的贪心算法
相关文章
相关标签/搜索