/*
Online Java - IDE, Code Editor, Compiler

Online Java is a quick and easy tool that helps you to build, compile, test your programs online.
*/

//VERSION 2a

public class Main
{
    
    static long startTime;
    static long endTime;
    static boolean running;
    static long elapsed;
    
    static int lengthFirstNumber; 
    static int lengthSecondNumber;
    static String lastDigitFirstNumber;  
    static String lastDigitSecondNumber;
    static int counter;
    static boolean consecutiveNines;
    static int firstDigitTotalDigits;
    static int lastDigitTotalDigits;
    static int total;
    static String grandTotal=""; 
    static String remainingPortion;
    static int remainingPortionInteger;
    static String remainingPortionString;
    static int lastDigitNumberOneRemainingPortion;
    static int lastDigitNumberTwoRemainingPortion;
    static String number;
    static int lastDigitRemainingPortion;
    static int lengthNumber;
    static String lastDigitNumber;
    
    public static void start() 
    {
        Main.startTime = System.nanoTime();
        Main.running = true;
    }

    public static void stop() 
    {
        Main.endTime = System.nanoTime();
        Main.running = false;
    }

    public static long getElapsedTime() 
    {
        if (running) {
            elapsed = System.nanoTime() - startTime;
        } 
        else 
        {
            elapsed = endTime - startTime;
        }
        return elapsed;
    }

    public static double getElapsedTimeInSeconds() 
    {
        return getElapsedTime() / 1_000_000_000.0;
    }
    
    public static void main(String[] args) 
    {
        System.out.println("Welcome to Online IDE!! Happy Coding :)");
        System.out.println("Addition program, ensure String has maximum characters: " + "2,147,483,648");
        
         //***PASS****  - 100*** via final test
        //String number2="99";
        //String number1= "1";
        
        //***PASS**1764*** via final test 0,2,3,4,5,27
        //String number2="993";
        //String number1="771";
        
        //to see reachability of final test 1
        //***PASS**1764*** via final test 0,1,3,5,27
        //String number2="243";
        //String number1="541";
        
        //PASS*****160****** - via final test 
        //String number2 = "136";
        //String number1 =  "24";
        
        //PASS******846370032454542****** via final test 
        //String number2 = "846369999999999";
        //String number1 =        "32454543";
        
        //PASS****82160**** via final test 
        //String number2 = "81636";   
        //String number1 =   "524";
        
        //PASS******* - 400219  via final test 
        //String number2 = "399627";   
        //String number1 =    "592";
        
        //pass********* - 400019 via final test 
        //String number2 = "399947";   
        //String number1 =     "72";
        
        //PASS***4962****** getting via final test 
        //String number2 =   "3970";   
        //String number1 =    "992";
        
        //PASS******  562  via final test 
        //String number1 =   "370";   
        //String number2 =   "192";
        
        //PASS**** - 1000  via final test 
        //String number2 =   "999";   
        //String number1 =     "1";
        
        //PASS*****  1998 via final test 
        //String number1 =   "999";   
        //String number2 =   "999";
        
        //PASS ******* 1098 via final test 
        //String number1 =   "999";   
        //String number2 =    "99";
        
        //***PASS***108 via final test 
        //String number1 =   "99";   
        //String number2 =   " 9";
    
         //***PASS**** 1400019  via final test
         //String number2 = "1399947";   
         //String number1 =      "72";
         
        //***PASS****5210*** via final test 
        //String number2 = "4666";
        //String number1 =  "544";
        
        //***PASS***711**** via final test 
        //String number2 =  "652";
        //String number1 =   "59";
        
        //PASS****1390219 ***** via final test 
        //String number2 = "1389627";   
        //String number1 =     "592";        

        //PASS***********22023**** via final test 
        //String number1 = "21999";   
        //String number2 =     "24";
        
        //PASS****2*******  via final test 
        //String number1 = "1";   
        //String number2 = "1";
        
        //PASS***10********  via final test 
        //String number1 = "1";   
        //String number2 = "9";
        
        //PASS***95759******** via final test 
        //String number1 = "95427";   
        //String number2 =   "332";
        
        //PASS*****9719******   via final test
        //String number1 = "9647";   
        //String number2 =   "72";
        
        //PASS****100119*******   via  final test 
        //String number1 = "99647";   
        //String number2 =   "472";
        
        //   **PASS** 10009 via  final test 
        //String number1 ="9947"; 
        //String number2 = " 62";
        
        //PASS via  final test 
        //***PASS  22023
        //String number1 = "21999";   
        //String number2 =     "24";
        
        //PASS 108 via  final test 
        //String number1 = "99";   
        //String number2 =  "9";
        
        //PASS getting 1000  via final test 3,4,8,10,11,13,15,18,19,22,23,26,27
        //String number1 = "999";
        //String number2 = "1";
        
        //PASS via final test 3,7,8,10,11,12,27
        //String number1 = "888";
        //String number2 = "1";
        
        //PASS  via final test 3,4,27
        //String number1 = "99999999999999999999999999999999999999999999999999999999";
        //String number2 = "32423543534543532423432423432494355443534532235324324333";
        
        
        //**************INTRODUCING FEW EXTRA TEST CASES
        
        //***PASS   1000000  via final test  3,4,6,7,8,10,11,13,15,17,18,19,22,23,26,27
        //String number1 = "999999";
        //String number2 = "1";
        
        //****PASS  10001424201998***  via final test 3,4,5,6,7,8,10,11,13,15,17,18,19,22,23,26,27
        //String number1 = "9999990767676";
        //String number2 = "1433434322";
        
        //****PASS  giving 9999990767677***  NOW FIXED via final test 3,5,6,7,8,10,11,12,27
        //similar issues below previously
        //String number1 = "9999990767676";
        //String number2 = "1";
        
        //****PASS  giving 7899990767677***  NOW FIXED via final test 3,5,6,7,8,10,11,12,27
        //String number1 = "7899990767676";
        //String number2 = "1";
        //hence issue with transition from non-9s to 9s
        //so I am getting the code to print GrandTotal
        //at all the final test locations in which
        //it modifies the grandTotal
        //it is bizarre that it has not shown system.out.println() other
        //than grandTotal=7
        
        //PASS  ***78990767676****   via final test 3,5,6,7,8,10,,11,12,27
        //String number1 = "78990767676";
        //String number2 = "1";
        
        //****PASS  giving 97653***  via final test 3,5,6,7,8,10,11,27
        //String number1 = "97652";
        //String number2 = "1";
        
        start();
        System.out.println(number1 + "+" + number2 + "= " + addition(number1, number2));
        System.out.println(number1 + "+" + number2 + "= " + grandTotal);
        stop();
        System.out.println("Elapsed time in seconds: " + getElapsedTimeInSeconds());
    }
    
    public static String addition(String number1, String number2)
    {
        lengthFirstNumber=(number1.length());
        lengthSecondNumber=(number2.length());
        
      if (lengthFirstNumber==0 && lengthSecondNumber==0)
      {
          System.out.println("final test 0");
          
            if (firstDigitTotalDigits==0)
            {
                
                System.out.println("final test 1");
                return grandTotal;
            }
            else
            {
                System.out.println("FINAL TEST 2");
                grandTotal = firstDigitTotalDigits + grandTotal;
                return grandTotal;
            }
      }
       try
       {
           System.out.println("final test 3");
           lastDigitFirstNumber=number1.substring(lengthFirstNumber-1);
           lastDigitSecondNumber=number2.substring(lengthSecondNumber-1);
           total = Integer.valueOf(lastDigitFirstNumber) + Integer.valueOf(lastDigitSecondNumber) + firstDigitTotalDigits;
           
           if ((Integer.valueOf(lastDigitFirstNumber) + Integer.valueOf(lastDigitSecondNumber) + firstDigitTotalDigits)>=10)
           {
               System.out.println("final test 4");
               
               firstDigitTotalDigits = (int)total/10;
               lastDigitTotalDigits=total%10;
               grandTotal = Integer.toString(lastDigitTotalDigits) + grandTotal;
               addition(number1.substring(0, (lengthFirstNumber-1)), number2.substring(0, (lengthSecondNumber-1)));
           }
           else
           {   
               grandTotal = Integer.toString(total) + grandTotal;
               System.out.println("final test 5");
               
               firstDigitTotalDigits=0;
               
               addition(number1.substring(0, (lengthFirstNumber-1)), number2.substring(0, (lengthSecondNumber-1)));
            }
       }
       catch (NumberFormatException | StringIndexOutOfBoundsException s)
       {
            System.out.println("final test6");
            System.out.println("number 1 at this point: " + number1);
            System.out.println("number 2 at this point: " + number2);
      
            try
            {
                System.out.println("final test 7");
                
                if (number1.length()>number2.length())
                {
                    System.out.println("final test 8");
                }
                
                if (number2.length()>number1.length())
                {
                    System.out.println("final test 9");
                    number=number2;
                    lastDigitRemainingPortion = lastDigitNumberTwoRemainingPortion;
                    lengthNumber=lengthSecondNumber;
                    lastDigitNumber = lastDigitFirstNumber;
                }
                
                if (number!=null)
                {
                    System.out.println("final test 10");
                    
                    if(number.length()>1)
                    {
                        System.out.println("final test 11");
                        lastDigitNumber=number.substring(lengthNumber-1);
                        total = Integer.valueOf(lastDigitNumber) + firstDigitTotalDigits;
                        
                        if (total<10)
                        {
                            System.out.println("final test 12");
                            remainingPortionString=number.substring(0,(lengthNumber));
                            remainingPortion = remainingPortionString.substring(0, (lengthNumber-1));
                            grandTotal = remainingPortion + Integer.toString(total) + grandTotal;
                            return grandTotal;
                            
                        }
                        
                       else
                       {
                           System.out.println("final test 13");
                           
                           firstDigitTotalDigits=(int) total/10;  //expecting to get a 1
                           lastDigitTotalDigits=total%10;  //number between 0 and 8
                           remainingPortionInteger = (int) (Integer.valueOf(number) / 10);
                           lastDigitRemainingPortion =Integer.valueOf(Integer.valueOf(number)%10);
                          
                        if (((Integer.valueOf(number.substring((lengthNumber-1)))+firstDigitTotalDigits)<10))   
                        {
                            System.out.println("final test 14");
                           
                            total = lastDigitRemainingPortion + firstDigitTotalDigits;
                            grandTotal = remainingPortionInteger + total + grandTotal;
                            
                        }
                        else
                        {
                            System.out.println("final test 15");
                            
                            if(lengthNumber==1)
                            {
                                System.out.println("final test 16");
                                remainingPortionInteger=Integer.valueOf(number);
                                total = remainingPortionInteger + firstDigitTotalDigits;
      
                                grandTotal = Integer.toString(total) + grandTotal;
                               
                            }
                            else
                            {
                                System.out.println("final test 17");
                                firstDigitTotalDigits=1;
                                remainingPortionInteger = (int) (Integer.valueOf(number))/10;
                                
                                do
                                {
                                    System.out.println("\nfinal test 18");
                                    total = 0;  
                                    grandTotal = Integer.toString(total) + grandTotal;
                                    remainingPortionInteger = remainingPortionInteger/10;
                                    total = lastDigitRemainingPortion + firstDigitTotalDigits;
                                    lastDigitRemainingPortion = remainingPortionInteger%10;
                                    counter++;
                                    consecutiveNines=true;
                                    
                                }while(lastDigitRemainingPortion==9);
                        
                                System.out.println("final test 19");
                                
                            }//end of else  final test 17
            
                        }//end else final test 15 minimum 1 cascading effect   
        
                        }    //end of else final test 13 (total>10) 
                        
                    }    // this would be if final test 11 if(number.length()>1)
                    else
                    {
                        System.out.println("final test 20");
                        total = Integer.valueOf(lastDigitNumber) + firstDigitTotalDigits;
                        remainingPortionInteger=  Integer.valueOf(number);
                        total = remainingPortionInteger + firstDigitTotalDigits;
                        grandTotal = total + grandTotal;
                        
                        return grandTotal;
                    }
                }  // this is the end of final test 10   if (number!=null)
      
            }  //end try      final test 7
            
            catch (NumberFormatException n)
            {
                System.out.println("final test 21");
            }
            System.out.println("final test 22");
            
            if (consecutiveNines)
            {
                System.out.println("final test 23");
                total = Integer.valueOf(number.substring(0,lengthNumber-counter)) + firstDigitTotalDigits;
                grandTotal = total + grandTotal;
                
            }
            else
            {
                 if (remainingPortion==null)
                 {
                    System.out.println("final test 24");
                    total = 9 + firstDigitTotalDigits;
                    grandTotal = Integer.toString(total) + grandTotal;
                 }
                else
                {
                    System.out.println("final test 25");
                    grandTotal = total + grandTotal;
                }
            }       
            
            System.out.println("final test 26");
            return grandTotal;
            
    //end of final test 6    
        }   //end of    catch (NumberFormatException | StringIndexOutOfBoundsException s)
        
        System.out.println("final test 27");
        return "test";
    
    }  //end of main method
    
}//end of class