題目--求一個數組的最大子數和和最大子數組 及 判斷上三角矩陣

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算法及簡單的貪心算法
相關文章
相關標籤/搜索