My solution is as brute-force as it gets, using only adds and comparisons.
IDENTIFICATION DIVISION. PROGRAM-ID. SUM35. DATA DIVISION. WORKING-STORAGE SECTION. 01 THREE-COUNTER USAGE BINARY-CHAR value 1. 88 IS-THREE VALUE 3. 01 FIVE-COUNTER USAGE BINARY-CHAR value 1. 88 IS-FIVE VALUE 5. 01 SUMMER USAGE BINARY-DOUBLE value zero. 01 I USAGE BINARY-LONG. 01 N USAGE BINARY-LONG. PROCEDURE DIVISION. 10-MAIN-PROCEDURE. MOVE 1000000000 TO N. MOVE 1 TO I. PERFORM 20-INNER-LOOP WITH TEST AFTER UNTIL I >= N. DISPLAY SUMMER. STOP RUN. 20-INNER-LOOP. IF IS-THREE OR IS-FIVE ADD I TO SUMMER END-ADD IF IS-THREE MOVE 1 TO THREE-COUNTER ELSE ADD 1 TO THREE-COUNTER END-IF IF IS-FIVE MOVE 1 TO FIVE-COUNTER ELSE ADD 1 TO FIVE-COUNTER END-IF ELSE ADD 1 TO FIVE-COUNTER END-ADD ADD 1 TO THREE-COUNTER END-ADD END-IF. ADD 1 TO I. EXIT. END PROGRAM SUM35.The above code compiles on GnuCOBOL 2.0 and MicroFocus Visual COBOL 2.3. In the latter environment, I was able to get a run time of 7.3 seconds for the 1,000,000,000 iterations (AMD A6-5200 APU running at 2.00 GHz.)
I ended up in COBOL via the usual circuitous route through other programming languages after figuring out a solution using mLite. The next postings will demonstrate the mLite and perhaps others.
© Copyright Bruce M. Axtens., 2015
No comments:
Post a Comment