{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.\n", "\n", "Find the sum of all the multiples of 3 or 5 below 1000.\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "232169\n" ] } ], "source": [ "# Classic off-by-one error.\n", "# https://en.wikipedia.org/wiki/Off-by-one_error\n", "total = 0\n", "euler = 0\n", "while euler < 999:\n", " if (euler % 3 == 0) | (euler % 5 == 0):\n", " total = total + euler\n", " euler = euler + 1\n", " \n", "print(total)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "233168\n" ] } ], "source": [ "# Fix off-by-one error by changing comparison operator\n", "total = 0\n", "euler = 0\n", "while euler <= 999:\n", " if (euler % 3 == 0) | (euler % 5 == 0):\n", " total = total + euler\n", " euler = euler + 1\n", "\n", "print(total)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "233168\n" ] } ], "source": [ "# Replace magic number with a variable (n).\n", "# Also, let the machine do the dirty work.\n", "# That's why n is 1000 and the comparision is with n - 1.\n", "# Having the computer calculate n - 1 is the dirty work.\n", "\n", "n = 1000\n", " \n", "total = 0\n", "euler = 0\n", "while euler <= n - 1:\n", " if (euler % 3 == 0) | (euler % 5 == 0):\n", " total = total + euler\n", " euler = euler + 1\n", " \n", "print(total)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "233168\n" ] } ], "source": [ "# Use n instead of n-1 for standard programming conventions. \n", "# For loops that execute n times and start at 0\n", "# the convention is to initialize the loop counter with 0\n", "# for the comparision to be loop counter less than n.\n", "#\n", "# The C version of the idiom is\n", "#\n", "# for (euler = 0; euler < n; euler++)\n", "# ; /* whatever */\n", " \n", "n = 1000\n", " \n", "total = 0\n", "euler = 0\n", "while euler < n:\n", " if (euler % 3 == 0) | (euler % 5 == 0):\n", " total = total + euler\n", " euler = euler + 1\n", " \n", "print(total)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "233168\n" ] } ], "source": [ "# Replace the increment with variable name += increment.\n", " \n", "n = 1000\n", " \n", "total = 0\n", "euler = 0\n", "while euler < n:\n", " if (euler % 3 == 0) | (euler % 5 == 0):\n", " total = total + euler\n", " euler += 1\n", " \n", "print(total)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "233168\n" ] } ], "source": [ "# Don't stop at one bug.\n", "# Replace the increment with variable name += increment.\n", "# This time with accumulating the total.\n", " \n", "n = 1000\n", " \n", "total = 0\n", "euler = 0\n", "while euler < n:\n", " if (euler % 3 == 0) | (euler % 5 == 0):\n", " total += euler\n", " euler += 1\n", " \n", "print(total)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "233168\n" ] } ], "source": [ "# Replace | with or for readability.\n", "# It's more than readability, it's the wrong operator.\n", "# This is a bitwise or (0 or 1). It will always program both sides of the equation.\n", "# 'or' compares to False. This is safer if I could get per say a div/0.\n", " \n", "n = 1000\n", " \n", "total = 0\n", "euler = 0\n", "while euler < n:\n", " if (euler % 3 == 0) or (euler % 5 == 0):\n", " total += euler\n", " euler += 1\n", " \n", "print(total)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def foo(total):\n", " #total = 0\n", " for euler in range(1000):\n", " if (euler % 3 == 0) | (euler % 5 == 0):\n", " total = total + euler\n", " \n", " #print(total)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1000 loops, best of 3: 281 µs per loop\n" ] } ], "source": [ "import timeit\n", "%timeit foo(0)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "233168\n" ] } ], "source": [ "total = 0\n", "\n", "for euler in range(1000):\n", " if (euler % 3 == 0) | (euler % 5 == 0):\n", " total = total + euler\n", " \n", "print(total)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def foo(n):\n", " total = 0\n", "\n", " for euler in range(n):\n", " if (euler % 3 == 0) or (euler % 5 == 0):\n", " total = total + euler\n", "\n", " return total" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "23" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n = 10\n", "foo(n)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1000 loops, best of 3: 208 µs per loop\n" ] }, { "data": { "text/plain": [ "233168" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n = 1000\n", "%timeit foo(n)\n", "foo(n)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def foo(n):\n", " total = 0\n", "\n", " for i in range(n):\n", " if (i % 3 == 0) or (i % 5 == 0):\n", " total += i\n", "\n", " return total" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1000 loops, best of 3: 209 µs per loop\n" ] }, { "data": { "text/plain": [ "233168" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n = 1000\n", "%timeit foo(n)\n", "foo(n)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.4.3" } }, "nbformat": 4, "nbformat_minor": 0 }