// Path: BirIslem/src/main/java/birislem/exception/EarlyConvergenceException.java
// public class EarlyConvergenceException extends Exception {
//     private static final long serialVersionUID = 1L;
// 
//     // Hangi operatorde hedef sayiya ulastik
//     private final int whichOperator;
// 
//     public EarlyConvergenceException(int whichOperator) {
//         super();
//         this.whichOperator = whichOperator;
//     }
// 
//     public int getWhichOperator() {
//         return this.whichOperator;
//     }
// }
// 
// Path: BirIslem/src/main/java/birislem/exception/FractionDivideException.java
// public class FractionDivideException extends Exception {
//     private static final long serialVersionUID = 1L;
//     // FIX Performans kazanci
//     // Her seferinde bu istisnadan yeni bir tane yaratmak yerine
//     // tum uygulamada sadece bir ornegini kullanmak icin
//     // singleton kullaniliyor
//     private static FractionDivideException instance = null;
// 
//     private FractionDivideException() {
// 
//     }
// 
//     public static FractionDivideException getInstance() {
//         if (instance == null) {
//             instance = new FractionDivideException();
//         }
//         return instance;
//     }
// 
// }


import java.util.Random;
import birislem.exception.EarlyConvergenceException;
import birislem.exception.FractionDivideException;
     * @throws FractionDivideException   eger bolme islemi tamsayi sonuc uretmiyorsa
     * @throws EarlyConvergenceException hesaplamanin erken asamalarinda hedefe ulasirsak
     */
    public int getHesapSonuc(int[] sayilar, int[] operatorler)
            throws FractionDivideException, EarlyConvergenceException {
        int hesapSonucu;
        int hangiSayi;
        int baslangic = 0;
        // TODO ilk sayiyi her zaman kullaniyor
        // if (operatorler[0] != SayiArac.KULLANMA) {
        hesapSonucu = hesaplamaSayilari[sayilar[0]];
        hangiSayi = 1;
        /*
         * } else { hesapSonucu = hesaplamaSayilari[sayilar[1]]; hangiSayi = 2;
         * baslangic = 1; }
         */
        for (int i = baslangic; i < operatorler.length; i++) {
            int sayi = hesaplamaSayilari[sayilar[hangiSayi]];
            if (operatorler[i] == NumberUtility.ARTI) {
                hesapSonucu += sayi;
            }
            if (operatorler[i] == NumberUtility.CARPI) {
                hesapSonucu *= sayi;
            }
            if (operatorler[i] == NumberUtility.BOLU) {
                if (hesapSonucu % sayi != 0) {
                    // FIX Bolme isleminde mutlaka tam sayi elde etmeliyiz
                    // FIX her seferinde yeni bir ornek yaratmak
                    // gereksiz zaman harcatiyordu bunun yerine
                    // singleton kullanildi
// Path: BirIslem/src/main/java/birislem/exception/EarlyConvergenceException.java
// public class EarlyConvergenceException extends Exception {
//     private static final long serialVersionUID = 1L;
// 
//     // Hangi operatorde hedef sayiya ulastik
//     private final int whichOperator;
// 
//     public EarlyConvergenceException(int whichOperator) {
//         super();
//         this.whichOperator = whichOperator;
//     }
// 
//     public int getWhichOperator() {
//         return this.whichOperator;
//     }
// }
// 
// Path: BirIslem/src/main/java/birislem/exception/FractionDivideException.java
// public class FractionDivideException extends Exception {
//     private static final long serialVersionUID = 1L;
//     // FIX Performans kazanci
//     // Her seferinde bu istisnadan yeni bir tane yaratmak yerine
//     // tum uygulamada sadece bir ornegini kullanmak icin
//     // singleton kullaniliyor
//     private static FractionDivideException instance = null;
// 
//     private FractionDivideException() {
// 
//     }
// 
//     public static FractionDivideException getInstance() {
//         if (instance == null) {
//             instance = new FractionDivideException();
//         }
//         return instance;
//     }
// 
// }


// Path: BirIslem/src/main/java/birislem/utility/NumberUtility.java
import java.util.Random;
import birislem.exception.EarlyConvergenceException;
import birislem.exception.FractionDivideException;

     * @throws FractionDivideException   eger bolme islemi tamsayi sonuc uretmiyorsa
     * @throws EarlyConvergenceException hesaplamanin erken asamalarinda hedefe ulasirsak
     */
    public int getHesapSonuc(int[] sayilar, int[] operatorler)
            throws FractionDivideException, EarlyConvergenceException {
        int hesapSonucu;
        int hangiSayi;
        int baslangic = 0;
        // TODO ilk sayiyi her zaman kullaniyor
        // if (operatorler[0] != SayiArac.KULLANMA) {
        hesapSonucu = hesaplamaSayilari[sayilar[0]];
        hangiSayi = 1;
        /*
         * } else { hesapSonucu = hesaplamaSayilari[sayilar[1]]; hangiSayi = 2;
         * baslangic = 1; }
         */
        for (int i = baslangic; i < operatorler.length; i++) {
            int sayi = hesaplamaSayilari[sayilar[hangiSayi]];
            if (operatorler[i] == NumberUtility.ARTI) {
                hesapSonucu += sayi;
            }
            if (operatorler[i] == NumberUtility.CARPI) {
                hesapSonucu *= sayi;
            }
            if (operatorler[i] == NumberUtility.BOLU) {
                if (hesapSonucu % sayi != 0) {
                    // FIX Bolme isleminde mutlaka tam sayi elde etmeliyiz
                    // FIX her seferinde yeni bir ornek yaratmak
                    // gereksiz zaman harcatiyordu bunun yerine
                    // singleton kullanildi
                    throw FractionDivideException.getInstance();