/*
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 3a

public class Main
{
    static long startTime;
    static long endTime;
    static boolean running;
    static long elapsed;
    
    static long lastDigitNumber; //this performs %10 on remainingPortion
    static long remainingPortion;
    
    static boolean finishedUniformMSD;
    static boolean finishedExecution;
    static long carryForward;
    static long total;
    static boolean consecutiveNines=false;
    static String number;
    static String backupTotal;
    static String backupGrandTotal;
    static long remainingPortionFirstNumber;
    static long remainingPortionSecondNumber;
    static long lastDigitFirstNumber;
    static long lastDigitSecondNumber;
    static long lastDigitTotal;
   
    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 :)");
        
        //***PASS****  - 100*** via final test 0,1,3,4,7,8,9,10,11,17,18,21
        //String number2="99";
        //String number1= "1";
        
        //***PASS**1764*** via final test 0,1,2,3,4,5,6
        //String number2="993";
        //String number1="771";
        
        //***PASS**1764*** via final test via final test 0,1,2,3,4,5,6
        //String number2="243";
        //String number1="541";
        
        //PASS*****160****** - via final test 0,1,3,4,5,7,8,9,14,21
        //String number2 = "136";
        //String number1 =  "24";
        
        //PASS******846370032454542****** via final test 0,3,4,7,8,9,10,12,13,17,18,21
        //String number2 = "846369999999999";
        //String number1 =        "32454543";
        
        //PASS****82160**** via final test 0,1,3,4,5,7,8,9,14,15,21
        //String number2 = "81636";   
        //String number1 =   "524";
        
        //PASS******* - 400219  via final test 0,1,3,4,5,7,8,9,10,11,12,17,18,21
        //String number2 = "399627";   
        //String number1 =    "592";
        
        //pass********* - 400019 via final test 0,1,3,4,5,7,8,9,10,11,12,17,18,21,
        //String number2 = "399947";   
        //String number1 =     "72";
        
        //PASS***4962****** getting via final test 0,1,3,4,5,7,8,9,14,21
        //String number2 =   "3970";   
        //String number1 =    "992";
        
        //PASS******  562  via final test 0,1,2,3,4,5,6,
        //String number1 =   "370";   
        //String number2 =   "192";
        
        //PASS**** - 1000  via final test 0,1,4,7,8,9,10,11,12,21
        //String number2 =   "999";   
        //String number1 =     "1";
        
        //PASS*****  1998 via final test 
        //String number1 =   "999";   
        //String number2 =   "999";
        
        //PASS ******* 1098 via final test 0,2,3,4,7,8,9,10,11,17,18,21
        //String number1 =   "999";   
        //String number2 =    "99";
        
        //***PASS***108 via final test 0,2,3,4,7,8,9,10,11,18,19,21
        //String number1 =   "99";   
        //String number2 =   "9";
    
         //***PASS**** 1400019  via final test 0,1,3,4,5,7,8,9,10,12,13,21
         //String number2 = "1399947";   
         //String number1 =      "72";
         
        //***PASS****5210*** via final test 0,1,3,4,7,8,9,14,21, 
        //String number2 = "4666";
        //String number1 =  "544";
        
        //***PASS***711**** via final test 0,1,3,4,7,8,9,14,21 
        //String number2 =  "652";
        //String number1 =   "59";
        
        //PASS****1390219 ***** via final test 0,3,4,5,7,8,9,10,12,13,17,18,21
        //String number2 = "1389627";   
        //String number1 =     "592";        

        //PASS***********22023**** via final test 0,2,3,4,7,8,9,10,12,13,17,18,21
        //String number1 = "21999";   
        //String number2 =     "24";
        
        //PASS****2*******  via final test 0,1,2,3,5,6
        //String number1 = "1";   
        //String number2 = "1";
        
        //PASS***10********  via final test 0,1,2,4,6,
        //String number1 = "1";   
        //String number2 = "9";
        
        //PASS***95759******** via final test 0,2,3,5
        //String number1 = "95427";   
        //String number2 =   "332";
        
        //PASS*****9719******   via final test 0,2,3,4,5,7,8,9,14,15,21
        //String number1 = "9647";   
        //String number2 =   "72";
        
        //PASS****100119*******   via  final test 0,2,3,4,5,7,8,9,10,11,12,17,18,21
        //String number1 = "99647";   
        //String number2 =   "472";
        
        //**PASS** 10009 via  final test 0,2,3,4,5,7,8,9,10,11,12,17,18,21
        //String number1 ="9947"; 
        //String number2 = "62";
        
        //PASS via  final test 0,2,3,4,7,8,9,10,12,13,17,18,21,
        //***PASS  22023
        //String number1 = "21999";   
        //String number2 =     "24";
        
         //***PASS***108 via final test 0,2,3,4,7,8,9,10,11,18,19,21
        //String number1 = "99";   
        //String number2 =  "9";
        
        //PASS getting 1000  via final test 0,2,3,4,7,8,9,10,11,12,17,18,21
        //String number1 = "999";
        //String number2 = "1";
        
        //PASS via final test 0,2,3,5,7,8,9,14,15,21
        //String number1 = "888";
        //String number2 = "1";
        
        //FAIL NumberFormatException  remainingPortionFirstNumber=Long.valueOf(number1);
        //String number1 = "99999999999999999999999999999999999999999999999999999999";
        //String number2 = "32423543534543532423432423432494355443534532235324324333";
       
       //shortened the numbers same outcome 
        //FAIL NumberFormatException  remainingPortionFirstNumber=Long.valueOf(number1);
        //String number1 = "99999999999999999999999999999999999";
        //String number2 = "32423543534543532";
        
        //shortened the numbers same outcome 
        //FAIL NumberFormatException  remainingPortionFirstNumber=Long.valueOf(number1);
        //String number1 = "321326263232722172323121232212212212";
        //String number2 = "32423543534543531";
        
        //shortened the numbers, any longer than this and program will render 
        //FAIL NumberFormatException  remainingPortionFirstNumber=Long.valueOf(number1);
        //***PASS*** 1845561698584545666  via final test 0,1,2,3,4,5,6
        //String number1 = "921326263239897898";
        //String number2 = "924235435344647768";
        
        //**************INTRODUCING FEW EXTRA TEST CASES
        
        //***PASS   1000000  via final test 0,2,3,4,7,8,9,10,11,12,17,18,21
        //String number1 = "999999";
        //String number2 = "1";
        
        //****PASS  10001424201998***  via final test 0,2,3,4,5,7,8,9,11,12,17,18,21
        //String number1 = "9999990767676";
        //String number2 = "1433434322";
        
        //****PASS  giving 9999990767677***  NOW FIXED via final test 0,2,3,5,7,8,9,14,15,21
        //similar issues below previously
        //String number1 = "9999990767676";
        //String number2 = "1";
        
        //****PASS  giving 7899990767677***  NOW FIXED via final test 0,2,3,5,7,8,9,14,15,21
        //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  ***78990767677****   via final test 0,2,3,5,7,8,9,14,15,21
        //String number1 = "78990767676";
        //String number2 = "1";
        
        //****PASS  giving 97653*** via final test 0,2,5,7,8,9,14,15,21
        String number1 = "97652";
        String number2 = "1";
        
        //starts the clock
        start();
        System.out.println(number1 + "+" + number2 + "= " + addition(number, number1, number2));
        System.out.println(number1 + "+" + number2 + "= " + grandTotal);
        
        //stops the clock
        stop();
        System.out.println("Elapsed time in seconds: " + getElapsedTimeInSeconds());
       
    }
   
    public static String addition (String number, String number1, String number2)
    {
        System.out.println("final test 0");
        remainingPortionFirstNumber=Long.valueOf(number1);
        remainingPortionSecondNumber=Long.valueOf(number2);
        
        if (remainingPortionFirstNumber==0 && !consecutiveNines)
        {
            System.out.println("final test 1");
            
            remainingPortion=remainingPortionSecondNumber;
            number=number2;   //it assigns the other number to give correct logic
            finishedUniformMSD = true;
        }
        
        if (remainingPortionSecondNumber==0 && !consecutiveNines)
        {
            System.out.println("final test 2");
            remainingPortion=remainingPortionFirstNumber;
            number=number1;  //it assigns the other number to give correct logic
            finishedUniformMSD = true;
            System.out.println(grandTotal);
        }
        if (!finishedUniformMSD)
        {
            System.out.println("final test 3");
            lastDigitFirstNumber = remainingPortionFirstNumber%10;
                
            lastDigitSecondNumber = remainingPortionSecondNumber%10;
            total = lastDigitFirstNumber + lastDigitSecondNumber;
            remainingPortionFirstNumber = remainingPortionFirstNumber/10;
            remainingPortionSecondNumber=remainingPortionSecondNumber/10;
            
            if (total+carryForward>=10 && !finishedExecution)
            {
                backupTotal=Long.toString(total+carryForward);
                backupGrandTotal = grandTotal;
                total = total + carryForward;
                lastDigitTotal = total%10;
                grandTotal = lastDigitTotal + grandTotal;
                carryForward=1;
                
                addition(number, Long.toString(remainingPortionFirstNumber), Long.toString(remainingPortionSecondNumber));
            }  //end of if total 10-18
                
            
            if (total+carryForward<10 && !finishedExecution)
            {
                System.out.println("final test 5");
                backupTotal=Long.toString(total+carryForward);
                backupGrandTotal = grandTotal;
                total= total + carryForward;
                    
                lastDigitTotal = total%10;
                grandTotal = lastDigitTotal + grandTotal;
                carryForward=0;
                addition(number, Long.toString(remainingPortionFirstNumber), Long.toString(remainingPortionSecondNumber));
                }  //end if total +carryForward<10
                
            }  //end of if (!finishedUniformMSD)
           
            if (remainingPortionFirstNumber==0 && remainingPortionSecondNumber==0)
            {
                System.out.println("final test 6");
                grandTotal= String.valueOf(backupTotal) + backupGrandTotal;
                finishedExecution=true;
                return grandTotal;
            }
            
            else
            {
                System.out.println("final test 7");
                
                if (!finishedExecution)
                {
                    System.out.println("final test 8");
                    
                    if (remainingPortionFirstNumber%10 == 0  || remainingPortionSecondNumber==0)
                    {
                        System.out.println("final test 9");
                        remainingPortion = Long.valueOf(number);
                        lastDigitNumber = remainingPortion%10;
                        
                        if (consecutiveNines)
                        {
                            System.out.println("final test 10");
                            
                            if (remainingPortion/10==0)
                            {
                                System.out.println("final test 11");
                                total = lastDigitNumber + carryForward;
                                grandTotal = Long.toString(total)+ grandTotal;
                                finishedExecution=true;
                                return grandTotal;
                            }
                            
                            lastDigitNumber = remainingPortion%10;
                            
                            if (lastDigitNumber==9)
                            {
                                System.out.println("final test 12");
                                total = lastDigitNumber + carryForward;
                                lastDigitNumber=total%10;
                                grandTotal = lastDigitNumber + grandTotal;
                                remainingPortion=remainingPortion/10;
                                consecutiveNines=true;
                                addition(Long.toString(remainingPortion), number1, number2);
                            }
                            
                            else
                            {
                                System.out.println("final test 13");
                                total = lastDigitNumber + carryForward;
                                grandTotal = total + grandTotal;
                                remainingPortion=remainingPortion/10;
                                grandTotal = remainingPortion + grandTotal;
                                finishedExecution=true;
                                return grandTotal;
                            }
                        }
                        if (lastDigitNumber+carryForward<10 && !finishedExecution)     //lastdigit = 3
                        {
                            System.out.println("final test 14");
                            total = lastDigitNumber + carryForward;
                            grandTotal = Long.toString(total) + grandTotal;
                            remainingPortion=remainingPortion/10;
           
                            if (remainingPortion!=0)
                            {
                                System.out.println("final test 15");
                                grandTotal=remainingPortion+grandTotal;
                                finishedExecution=true;
                            }
                            System.out.println(grandTotal);
                            finishedExecution=true;
                            return grandTotal;
                        }
                        
                        if (lastDigitNumber+carryForward>9 && !finishedExecution)
                        {
                            System.out.println("final test 17");
                            
                            if (remainingPortion%10==9)
                            {
                                System.out.println("final test 18");
                                consecutiveNines=true;
                   
                                addition(Long.toString(remainingPortion), number1, number2);
                            }
                        if (lastDigitNumber!=9 && !finishedExecution)
                        {
                            System.out.println("final test 19");
                            total = lastDigitNumber + 1;
                            grandTotal = total + grandTotal;
                            remainingPortion=remainingPortion/10;   //now 78
                            System.out.println(remainingPortion);
                            grandTotal = remainingPortion + grandTotal;
                            System.out.println(grandTotal);
                            return grandTotal;
                        }
                        
                        if (!finishedExecution)
                        {
                            System.out.println("final test 20");
                            grandTotal=remainingPortion+grandTotal;
                            return grandTotal;
                        }
                            
                        }
                    }
                }
            }  //end of else
            System.out.println("final test 21");
            
            return grandTotal;
    }
}