問題の整数配列と最大サブアレイ(続き)

I.説明:これは中仕事でブログ投稿の新しい追加された新しい要件に基づいて書かれました

第二に、新しい要件:

図1に示すように、ファイルが必要アレイから読み出されます。

2、入力配列が大きく、大きな数字が多い、(オーバーフローの数を考慮して)より大きな結果を生成する場合は、あなたのプログラムは正常出力できることを確認してください。

入力パラメータ・ファイルにエラーがある場合は3また、プログラムは正常終了し、適切なエラーメッセージを表示することができなければなりません。任意の入力エラーは、プログラムがクラッシュすることはできません。

第三に、問題解決のアイデア:

図1に示すように、ファイルが使用して、読み取るFileReaderのクラス(このクラスは、文字によってデータストリームの文字を読み取る。InputStreamReaderのFileReaderのクラスからクラス継承を)と  BufferedReaderのクラスので効果的にように、入力ストリームと文字バッファから文字を読み取るために(BufferedReaderのクラスファイルを読むために、文字、配列、行)の読み出し。

2、解決するために、BigIntegerのを使用して大規模なデジタルデータのオーバーフローの使用。(概念および使用方法のBigIntegerの:https://blog.csdn.net/qq_41668547/article/details/87628618

3、自分の誤りを制御するためのtry-catchメカニズムを使用すると発生する可能性があります。

第四に、ソースコード

パッケージcom.me.array。

輸入java.io.BufferedReader;
インポートのjava.io.File;
輸入java.io.FileNotFoundException。
輸入java.io.FileReader;
インポートにjava.io.IOException;
インポートがjava.math.BigInteger; 

パブリック クラスArrayMax3 { 

    @SuppressWarnings( "リソース")// 消除警告、看着舒服
    パブリック 静的 ボイドメイン(文字列[]引数)スローのIOException { 
        文字列の行を = "" ; 
        文字列のSNUM [] = 新しい文字列[100 ]。
        SP文字列[] = 新しい新しい文字列[10]; // セットnum.txtデータ線10 
        ファイルファイル= 新しい新ファイル( "num.txt"); // この場合num.txtのJava作品 
        BufferedReaderのBR = NULL ;
         試み{ 
            BR = 新しい新しいをBufferedReader(新しい新しいFileReaderの(ファイル)); 
        } キャッチ(FileNotFoundExceptionをE){ 
            System.out.printlnは(「ファイルがこのJava num.txtエンジニアリングではないが、再度お試しくださいファイルの場所のセット」) ;
             リターン; 
        } 
        int型の TEMP = 0 ;
         INTK = 0 int型私= 0 ; 
        BigIntegerの大きなは[] = 新しい BigIntegerの[100 ]; 
        BigIntegerのBIG2 [] = 新しい BigIntegerの[100 ]。
        BigIntegerのbigmax = 新しいのBigInteger( " - 9999999999" ); 
        BigIntegerのbigmax2 = 新しいのBigInteger( "0" ); 
        BigIntegerのbigmin = 新しいのBigInteger( "9999999999" ); 
        BigIntegerのbigsum = 新しいのBigInteger( "0" );
        // 使用のBigInteger读文件按行读取文件
        しばらくは((ライン= br.readLine())!= nullは){ 
            SP = line.splitは、( ""); // 機能を分割するプレススペース
            のためには、(私は= 0; I <sp.length; I ++ ){ 
                SNUM [ TEMP] = SP [I]; 
                TEMP ++ ; 
            } 
        } 
        // データ変換
        試みを{
             ため(I = 0、I <snum.length; I ++){ //はのBigIntegerに変換
                IF(!SNUM [I] = NULL ) { 
                    ビッグ[I] = 新しい新規のBigInteger(SNUM [I]); 
                    BIG2 [I]= ビッグ[I];
                     // するSystem.out.println(ビッグ[I]); 
                    bigsum = bigsum.add(ビッグ[I]); 
                } 
            } 
        } キャッチ(NumberFormatExceptionがE)は{ // 例外データ変換処理が終了します要件3。 
            のSystem.out.println(「異常な文字がファイルに存在し、更新再度お試しください!」);
             リターン; 
        } 
        I = 0 ;
         //は、データファイルKの数を判断
        しながら(ビッグ[I]を! = NULL ){ 
            K ++ ; 
            I ++ ; 
        } 
        //最大アレイQiuzi 
        のBigInteger B0 = 新しい新規のBigInteger( "0" のために(I = 1; I <K; I ++ ){
             IF([-I 1]ビッグ.compareTo(B0)> 0 ){ 
                ビッグ[I]ビッグ= [I] .add(ビッグ[-I 1。;])
            } 
        } 
        のために(; I <K、I ++ I = 0 ){
             IF(ビッグ[I] .compareTo(Bigmax)> 0 ){ 
                Bigmax = ビッグ[ I]; 
            } 
        } 
        のSystem.out.println( +「およびすべてのサブアレイの最大値は」Bigmax);
         // 環状アレイQiuziアレイ最小
        ため(I 1 =、I <K; I ++ ){
             場合(BIG2 [I-1] .compareTo(B0)<0 ){ 
                BIG2 [I] = BIG2 [I] .add(BIG2 [I-1 ])。
            } 
        } 
        のためには、(I 0 =、I <K; I ++ ){
             場合(BIG2 [I] .compareTo(bigmin)<0 ){ 
                bigmin = BIG2 [I]。
            } 
        } 
        bigmax = bigsum.subtract(bigmin)。
        // するSystem.out.println(bigsum)。
        // するSystem.out.println(bigmin)。
        もし(bigmax.compareTo(bigmax2)> 0 ){ 
            のSystem.out.println(「全てのサブアレイの最大値と環状配列である」+ Bigmax); 
        } { 
            するSystem.out.println(「全てのサブアレイの最大値と環状配列である」+ bigmax2) ; 
        } 
    } 

}

第五には、テストを実行します

 

 

 

 

 

 

 

 

 

おすすめ

転載: www.cnblogs.com/20183544-wangzhengshuai/p/12365976.html