Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <!DOCTYPE html><html><head><meta charset="UTF-8"><style>
- html {
- font-size: 100%;
- overflow-y: scroll;
- -webkit-text-size-adjust: 100%;
- -ms-text-size-adjust: 100%;
- }
- body {
- color: #444;
- font-family: Georgia, Palatino, 'Palatino Linotype', Times, 'Times New Roman', serif, "Hiragino Sans GB", "STXihei", "微软雅黑";
- font-size: 12px;
- line-height: 1.5em;
- background: #fefefe;
- width: 45em;
- margin: 10px auto;
- padding: 1em;
- outline: 1300px solid #FAFAFA;
- }
- a {
- color: #0645ad;
- text-decoration: none;
- }
- a:visited { color: #0b0080 }
- a:hover { color: #06e }
- a:active { color: #faa700 }
- a:focus { outline: thin dotted }
- a:hover, a:active { outline: 0 }
- span.backtick {
- border: 1px solid #EAEAEA;
- border-radius: 3px;
- background: #F8F8F8;
- padding: 0 3px 0 3px;
- }
- ::-moz-selection {
- background: rgba(255,255,0,0.3);
- color: #000;
- }
- ::selection {
- background: rgba(255,255,0,0.3);
- color: #000;
- }
- a::-moz-selection {
- background: rgba(255,255,0,0.3);
- color: #0645ad;
- }
- a::selection {
- background: rgba(255,255,0,0.3);
- color: #0645ad;
- }
- p { margin: 1em 0 }
- img { max-width: 100% }
- h1, h2, h3, h4, h5, h6 {
- font-weight: normal;
- color: #111;
- line-height: 1em;
- }
- h4, h5, h6 { font-weight: bold }
- h1 { font-size: 2.5em }
- h2 {
- font-size: 2em;
- border-bottom: 1px solid silver;
- padding-bottom: 5px;
- }
- h3 { font-size: 1.5em }
- h4 { font-size: 1.2em }
- h5 { font-size: 1em }
- h6 { font-size: 0.9em }
- blockquote {
- color: #666666;
- margin: 0;
- padding-left: 3em;
- border-left: 0.5em #EEE solid;
- }
- hr {
- display: block;
- height: 2px;
- border: 0;
- border-top: 1px solid #aaa;
- border-bottom: 1px solid #eee;
- margin: 1em 0;
- padding: 0;
- }
- kbd, samp {
- color: #000;
- font-family: monospace;
- font-size: 0.88em;
- border-radius: 3px;
- background-color: #F8F8F8;
- border: 1px solid #CCC;
- }
- code, tt {
- margin: 0 2px;
- padding: 0 5px;
- white-space: nowrap;
- font-family: Consolas, Monaco, monospace;
- border: 1px solid #eaeaea;
- background-color: #f8f8f8;
- border-radius: 3px; }
- pre code {
- margin: 0;
- padding: 0;
- white-space: pre;
- border: none;
- background: transparent; }
- .highlight pre {
- background-color: #f8f8f8;
- border: 1px solid #cccccc;
- font-family: Consolas, Monaco, monospace;
- font-size: 13px;
- line-height: 19px;
- overflow: auto;
- padding: 6px 10px;
- border-radius: 3px; }
- pre {
- background-color: #f8f8f8;
- border: 1px solid #cccccc;
- font-size: 13px;
- line-height: 19px;
- overflow: auto;
- padding: 6px 10px;
- border-radius: 3px; }
- pre code, pre tt {
- background-color: transparent;
- border: none; }
- .markdown-body code,.markdown-body tt{margin:0 2px;padding:0px 5px;white-space:nowrap;border:1px solid #eaeaea;background-color:#f8f8f8;border-radius:3px}
- .markdown-body pre>code{margin:0;padding:0;white-space:pre;border:none;background:transparent}
- .markdown-body .highlight pre,.markdown-body pre{background-color:#f8f8f8;border:1px solid #ccc;font-size:13px;line-height:19px;overflow:auto;padding:6px 10px;border-radius:3px}
- .markdown-body pre code,.markdown-body pre tt{background-color:transparent;border:none}
- .highlight{background:#ffffff}
- .highlight .c{color:#999988;font-style:italic}
- .highlight .err{color:#a61717;background-color:#e3d2d2}
- .highlight .k{color: #0000ff;}
- /*.highlight .o{font-weight:bold}*/
- .highlight .cm{color:#008000;font-style:italic}
- .highlight .cp{color:#d14;}
- .highlight .c1{color:#008000;font-style:italic}
- .highlight .cs{color:#999999;font-weight:bold;font-style:italic}
- .highlight .gd{color:#000000;background-color:#ffdddd}
- .highlight .gd .x{color:#000000;background-color:#ffaaaa}
- .highlight .ge{font-style:italic}
- .highlight .gr{color:#aa0000}
- .highlight .gh{color:#999999}
- .highlight .gi{color:#000000;background-color:#ddffdd}
- .highlight .gi .x{color:#000000;background-color:#aaffaa}
- .highlight .go{color:#888888}
- .highlight .gp{color:#555555}
- .highlight .gs{font-weight:bold}
- .highlight .gu{color:#800080;font-weight:bold}
- .highlight .gt{color:#aa0000}
- .highlight .kc{font-weight:bold}
- .highlight .kd{font-weight:bold}
- .highlight .kn{font-weight:bold}
- .highlight .kp{font-weight:bold}
- .highlight .kr{font-weight:bold}
- .highlight .kt{color:#0000ff;}
- .highlight .m{color:#009999}
- .highlight .s{color:#d14}
- .highlight .na{color:#008080}
- .highlight .nb{color:#0086B3}
- .highlight .nc{color:#445588;font-weight:bold}
- .highlight .no{color:#008080}
- .highlight .ni{color:#800080}
- .highlight .ne{color:#990000;font-weight:bold}
- .highlight .nf{color:#990000;font-weight:bold}
- .highlight .nn{color:#555555}
- .highlight .nt{color:#000080}
- .highlight .nv{color:#008080}
- .highlight .ow{font-weight:bold}
- .highlight .w{color:#bbbbbb}
- .highlight .mf{color:#009999}
- .highlight .mh{color:#009999}
- .highlight .mi{color:#009999}
- .highlight .mo{color:#009999}
- .highlight .sb{color:#d14}
- .highlight .sc{color:#d14}
- .highlight .sd{color:#d14}
- .highlight .s2{color:#d14}
- .highlight .se{color:#d14}
- .highlight .sh{color:#d14}
- .highlight .si{color:#d14}
- .highlight .sx{color:#d14}
- .highlight .sr{color:#009926}
- .highlight .s1{color:#d14}
- .highlight .ss{color:#990073}
- .highlight .bp{color:#999999}
- .highlight .vc{color:#008080}
- .highlight .vg{color:#008080}
- .highlight .vi{color:#008080}
- .highlight .il{color:#009999}
- .highlight .gc{color:#999;background-color:#EAF2F5}
- .type-csharp .highlight .k{color:#0000FF}
- .type-csharp .highlight .kt{color:#0000FF}
- .type-csharp .highlight .nf{color:#000000;font-weight:normal}
- .type-csharp .highlight .nc{color:#2B91AF}
- .type-csharp .highlight .nn{color:#000000}
- .type-csharp .highlight .s{color:#A31515}
- .type-csharp .highlight .sc{color:#A31515}
- b, strong { font-weight: bold }
- dfn { font-style: italic }
- ins {
- background: #ff9;
- color: #000;
- text-decoration: none;
- }
- mark {
- background: #ff0;
- color: #000;
- font-style: italic;
- font-weight: bold;
- }
- sub, sup {
- font-size: 75%;
- line-height: 0;
- position: relative;
- vertical-align: baseline;
- }
- sup { top: -0.5em }
- sub { bottom: -0.25em }
- ul, ol {
- margin: 1em 0;
- padding: 0 0 0 2em;
- }
- li p:last-child { margin: 0 }
- dd { margin: 0 0 0 2em }
- img {
- border: 0;
- -ms-interpolation-mode: bicubic;
- vertical-align: middle;
- }
- table {
- padding: 0; }
- table tr {
- border-top: 1px solid #cccccc;
- background-color: white;
- margin: 0;
- padding: 0; }
- table tr:nth-child(2n) {
- background-color: #f8f8f8; }
- table tr th {
- font-weight: bold;
- border: 1px solid #cccccc;
- text-align: left;
- margin: 0;
- padding: 6px 13px; }
- table tr td {
- border: 1px solid #cccccc;
- text-align: left;
- margin: 0;
- padding: 6px 13px; }
- table tr th :first-child, table tr td :first-child {
- margin-top: 0; }
- table tr th :last-child, table tr td :last-child {
- margin-bottom: 0;
- }
- td { vertical-align: top }
- @media only screen and (min-width: 480px) {
- body { font-size: 14px }
- }
- @media only screen and (min-width: 768px) {
- body { font-size: 16px }
- }
- @media print {
- * {
- background: transparent !important;
- color: black !important;
- filter: none !important;
- -ms-filter: none !important;
- }
- body {
- font-size: 12pt;
- max-width: 100%;
- }
- a, a:visited { text-decoration: underline }
- hr {
- height: 1px;
- border: 0;
- border-bottom: 1px solid black;
- }
- a[href]:after { content: " (" attr(href) ")" }
- abbr[title]:after { content: " (" attr(title) ")" }
- .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: "" }
- pre, blockquote {
- border: 1px solid #999;
- padding-right: 1em;
- page-break-inside: avoid;
- }
- tr, img { page-break-inside: avoid }
- img { max-width: 100% !important }
- }
- </style>
- <script>document.write('<script src="http://' + (location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1"></' + 'script>')</script></head><body><h2>Syntax Highlighting Test</h2>
- <div class="highlight"><pre><span class="cp">#ifndef GEARS_BIG_INTEGER_HPP</span>
- <span class="cp">#define GEARS_BIG_INTEGER_HPP</span>
- <span class="c1">//Includes</span>
- <span class="cp">#include <algorithm></span>
- <span class="cp">#include <iterator></span>
- <span class="cp">#include <iostream></span>
- <span class="cp">#include <sstream></span>
- <span class="cp">#include <string></span>
- <span class="cp">#include <deque></span>
- <span class="cp">#include <map></span>
- <span class="cp">#include <stdexcept></span>
- <span class="cm">/*</span>
- <span class="cm">TODO: Organize code, possibly update to more C++11 features.</span>
- <span class="cm">More error checking, improve division to be more accurate.</span>
- <span class="cm">More mathematical functions, e.g. isPrime() and sqrt()</span>
- <span class="cm">*/</span>
- <span class="k">namespace</span> <span class="n">gears</span> <span class="p">{</span>
- <span class="k">typedef</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ullong</span><span class="p">;</span>
- <span class="k">struct</span> <span class="n">BigInteger</span> <span class="p">{</span>
- <span class="c1">//Base value.</span>
- <span class="k">static</span> <span class="k">const</span> <span class="n">ullong</span> <span class="n">base</span> <span class="o">=</span> <span class="mi">10000</span><span class="p">;</span>
- <span class="c1">//N value</span>
- <span class="k">static</span> <span class="k">const</span> <span class="n">ullong</span> <span class="n">N</span> <span class="o">=</span> <span class="mi">4</span><span class="p">;</span>
- <span class="c1">//Digits holder.</span>
- <span class="n">std</span><span class="o">::</span><span class="n">deque</span><span class="o"><</span><span class="n">ullong</span><span class="o">></span> <span class="n">digits</span><span class="p">;</span>
- <span class="c1">//Default constructors.</span>
- <span class="n">BigInteger</span><span class="p">();</span>
- <span class="n">BigInteger</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">str</span><span class="p">);</span>
- <span class="n">BigInteger</span><span class="p">(</span><span class="n">ullong</span> <span class="n">num</span><span class="p">);</span>
- <span class="c1">//Operators</span>
- <span class="n">BigInteger</span><span class="o">&</span> <span class="k">operator</span><span class="o">+=</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">bi</span><span class="p">);</span>
- <span class="n">BigInteger</span><span class="o">&</span> <span class="k">operator</span><span class="o">-=</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">bi</span><span class="p">);</span>
- <span class="n">BigInteger</span><span class="o">&</span> <span class="k">operator</span><span class="o">*=</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">bi</span><span class="p">);</span>
- <span class="n">BigInteger</span><span class="o">&</span> <span class="k">operator</span><span class="o">/=</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">bi</span><span class="p">);</span>
- <span class="n">BigInteger</span><span class="o">&</span> <span class="k">operator</span><span class="o">%=</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">bi</span><span class="p">);</span>
- <span class="n">BigInteger</span><span class="o">&</span> <span class="k">operator</span><span class="o">/=</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">n</span><span class="p">);</span>
- <span class="n">BigInteger</span><span class="o">&</span> <span class="k">operator</span><span class="o">%=</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">n</span><span class="p">);</span>
- <span class="n">BigInteger</span><span class="o">&</span> <span class="k">operator</span><span class="o">*=</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">n</span><span class="p">);</span>
- <span class="n">BigInteger</span><span class="o">&</span> <span class="k">operator</span><span class="o"><<=</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">n</span><span class="p">);</span>
- <span class="c1">//TODO: operator>>=</span>
- <span class="n">BigInteger</span> <span class="k">operator</span><span class="o">+</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">bi</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
- <span class="n">BigInteger</span> <span class="k">operator</span><span class="o">-</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">bi</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
- <span class="n">BigInteger</span> <span class="k">operator</span><span class="o">*</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">bi</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
- <span class="n">BigInteger</span> <span class="k">operator</span><span class="o">/</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">bi</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
- <span class="n">BigInteger</span> <span class="k">operator</span><span class="o">%</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">bi</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
- <span class="n">BigInteger</span> <span class="k">operator</span><span class="o">*</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">n</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
- <span class="n">BigInteger</span> <span class="k">operator</span><span class="o">/</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">n</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
- <span class="n">BigInteger</span> <span class="k">operator</span><span class="o">%</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">n</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
- <span class="n">BigInteger</span> <span class="k">operator</span><span class="o"><<</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">n</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
- <span class="c1">//TODO: operator>></span>
- <span class="c1">//Comparison operators</span>
- <span class="kt">bool</span> <span class="k">operator</span><span class="o">==</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">other</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
- <span class="kt">bool</span> <span class="k">operator</span><span class="o">==</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">other</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
- <span class="kt">bool</span> <span class="k">operator</span><span class="o"><</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">other</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
- <span class="kt">bool</span> <span class="k">operator</span><span class="o"><</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">other</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
- <span class="kt">bool</span> <span class="k">operator</span><span class="o">></span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">other</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
- <span class="kt">bool</span> <span class="k">operator</span><span class="o">></span> <span class="p">(</span><span class="n">ullong</span> <span class="n">other</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
- <span class="kt">bool</span> <span class="k">operator</span><span class="o"><=</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">other</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
- <span class="kt">bool</span> <span class="k">operator</span><span class="o"><=</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">other</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
- <span class="kt">bool</span> <span class="k">operator</span><span class="o">>=</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">other</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
- <span class="kt">bool</span> <span class="k">operator</span><span class="o">>=</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">other</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
- <span class="kt">bool</span> <span class="k">operator</span><span class="o">!=</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">other</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
- <span class="kt">bool</span> <span class="k">operator</span><span class="o">!=</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">other</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
- <span class="c1">//Helper functions</span>
- <span class="kt">void</span> <span class="n">normalize</span><span class="p">();</span>
- <span class="n">BigInteger</span><span class="o">&</span> <span class="n">addZeroes</span><span class="p">(</span><span class="n">ullong</span> <span class="n">n</span><span class="p">);</span>
- <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">toString</span><span class="p">();</span>
- <span class="p">};</span>
- <span class="c1">//Helper classes and functors</span>
- <span class="k">struct</span> <span class="n">Add</span> <span class="p">{</span>
- <span class="n">ullong</span> <span class="k">operator</span><span class="p">()(</span><span class="n">ullong</span> <span class="n">a</span><span class="p">,</span> <span class="n">ullong</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
- <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="p">};</span>
- <span class="k">struct</span> <span class="n">Multiply</span> <span class="p">{</span>
- <span class="n">ullong</span> <span class="n">k</span><span class="p">;</span>
- <span class="n">Multiply</span><span class="p">()</span> <span class="p">{}</span>
- <span class="n">Multiply</span><span class="p">(</span><span class="n">ullong</span> <span class="n">n</span><span class="p">)</span><span class="o">:</span> <span class="n">k</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="p">{}</span>
- <span class="n">ullong</span> <span class="k">operator</span><span class="p">()(</span><span class="n">ullong</span> <span class="n">a</span><span class="p">)</span> <span class="p">{</span>
- <span class="k">return</span> <span class="n">a</span> <span class="o">*</span> <span class="n">k</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="p">};</span>
- <span class="k">struct</span> <span class="n">Carry</span> <span class="p">{</span>
- <span class="n">ullong</span><span class="o">&</span> <span class="n">carry</span><span class="p">;</span>
- <span class="n">Carry</span><span class="p">(</span><span class="n">ullong</span><span class="o">&</span> <span class="n">c</span><span class="p">)</span><span class="o">:</span> <span class="n">carry</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="p">{}</span>
- <span class="n">ullong</span> <span class="k">operator</span><span class="p">()(</span><span class="n">ullong</span> <span class="n">n</span><span class="p">)</span>
- <span class="p">{</span>
- <span class="n">n</span> <span class="o">+=</span> <span class="n">carry</span><span class="p">;</span>
- <span class="n">carry</span> <span class="o">=</span> <span class="n">n</span> <span class="o">/</span> <span class="n">BigInteger</span><span class="o">::</span><span class="n">base</span><span class="p">;</span>
- <span class="n">n</span> <span class="o">%=</span> <span class="n">BigInteger</span><span class="o">::</span><span class="n">base</span><span class="p">;</span>
- <span class="k">return</span> <span class="n">n</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="p">};</span>
- <span class="k">template</span> <span class="o"><</span><span class="k">class</span> <span class="nc">BaseOperator</span><span class="o">></span>
- <span class="k">struct</span> <span class="nl">OperatorCarry:</span> <span class="k">public</span> <span class="n">BaseOperator</span><span class="p">,</span> <span class="k">public</span> <span class="n">Carry</span> <span class="p">{</span>
- <span class="n">OperatorCarry</span><span class="p">(</span><span class="n">ullong</span><span class="o">&</span> <span class="n">c</span><span class="p">)</span><span class="o">:</span> <span class="n">Carry</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="p">{}</span>
- <span class="n">ullong</span> <span class="k">operator</span><span class="p">()(</span><span class="n">ullong</span> <span class="n">a</span><span class="p">)</span> <span class="p">{</span>
- <span class="k">return</span> <span class="n">Carry</span><span class="o">::</span><span class="k">operator</span><span class="p">()(</span><span class="n">BaseOperator</span><span class="o">::</span><span class="k">operator</span><span class="p">()(</span><span class="n">a</span><span class="p">));</span>
- <span class="p">}</span>
- <span class="n">ullong</span> <span class="k">operator</span><span class="p">()(</span><span class="n">ullong</span> <span class="n">a</span><span class="p">,</span> <span class="n">ullong</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
- <span class="k">return</span> <span class="n">Carry</span><span class="o">::</span><span class="k">operator</span><span class="p">()(</span><span class="n">BaseOperator</span><span class="o">::</span><span class="k">operator</span><span class="p">()(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">));</span>
- <span class="p">}</span>
- <span class="p">};</span>
- <span class="k">struct</span> <span class="n">Borrow</span> <span class="p">{</span>
- <span class="kt">long</span> <span class="kt">long</span><span class="o">&</span> <span class="n">borrow</span><span class="p">;</span>
- <span class="n">Borrow</span><span class="p">(</span><span class="kt">long</span> <span class="kt">long</span><span class="o">&</span> <span class="n">b</span><span class="p">)</span><span class="o">:</span> <span class="n">borrow</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="p">{}</span>
- <span class="n">ullong</span> <span class="k">operator</span><span class="p">()(</span><span class="kt">long</span> <span class="kt">long</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">n</span> <span class="o">-=</span> <span class="n">borrow</span><span class="p">;</span>
- <span class="n">borrow</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
- <span class="k">while</span> <span class="p">(</span><span class="n">n</span> <span class="o"><</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">n</span> <span class="o">+=</span> <span class="n">BigInteger</span><span class="o">::</span><span class="n">base</span><span class="p">;</span>
- <span class="o">++</span><span class="n">borrow</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="k">return</span> <span class="n">n</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="p">};</span>
- <span class="k">struct</span> <span class="n">SubtractionBorrow</span> <span class="p">{</span>
- <span class="kt">long</span> <span class="kt">long</span><span class="o">&</span> <span class="n">borrow</span><span class="p">;</span>
- <span class="n">SubtractionBorrow</span><span class="p">(</span><span class="kt">long</span> <span class="kt">long</span><span class="o">&</span> <span class="n">b</span><span class="p">)</span><span class="o">:</span> <span class="n">borrow</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="p">{}</span>
- <span class="n">ullong</span> <span class="k">operator</span><span class="p">()(</span><span class="kt">long</span> <span class="kt">long</span> <span class="n">a</span><span class="p">,</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
- <span class="kt">long</span> <span class="kt">long</span> <span class="n">n</span> <span class="o">=</span> <span class="n">b</span> <span class="o">-</span> <span class="n">a</span> <span class="o">-</span> <span class="n">borrow</span><span class="p">;</span>
- <span class="n">borrow</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
- <span class="k">while</span> <span class="p">(</span><span class="n">n</span> <span class="o"><</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">n</span> <span class="o">+=</span> <span class="n">BigInteger</span><span class="o">::</span><span class="n">base</span><span class="p">;</span>
- <span class="o">++</span><span class="n">borrow</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="k">return</span> <span class="n">n</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="p">};</span>
- <span class="n">BigInteger</span><span class="o">::</span><span class="n">BigInteger</span><span class="p">()</span> <span class="p">{</span>
- <span class="n">digits</span><span class="p">.</span><span class="n">assign</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span><span class="o">::</span><span class="n">BigInteger</span><span class="p">(</span><span class="n">ullong</span> <span class="n">num</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">std</span><span class="o">::</span><span class="n">stringstream</span> <span class="n">buffer</span><span class="p">;</span>
- <span class="n">buffer</span> <span class="o"><<</span> <span class="n">num</span><span class="p">;</span>
- <span class="o">*</span><span class="k">this</span> <span class="o">=</span> <span class="n">BigInteger</span><span class="p">(</span><span class="n">buffer</span><span class="p">.</span><span class="n">str</span><span class="p">());</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span><span class="o">::</span><span class="n">BigInteger</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">str</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">std</span><span class="o">::</span><span class="n">reverse</span><span class="p">(</span><span class="n">str</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">str</span><span class="p">.</span><span class="n">end</span><span class="p">());</span>
- <span class="k">while</span> <span class="p">(</span><span class="n">str</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">%</span> <span class="n">BigInteger</span><span class="o">::</span><span class="n">N</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span>
- <span class="n">str</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="sc">'0'</span><span class="p">);</span>
- <span class="n">std</span><span class="o">::</span><span class="n">reverse</span><span class="p">(</span><span class="n">str</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">str</span><span class="p">.</span><span class="n">end</span><span class="p">());</span>
- <span class="n">ullong</span> <span class="n">position</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
- <span class="n">ullong</span> <span class="n">size</span> <span class="o">=</span> <span class="n">str</span><span class="p">.</span><span class="n">size</span><span class="p">();</span>
- <span class="k">while</span><span class="p">(</span><span class="n">position</span> <span class="o">!=</span> <span class="n">size</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">std</span><span class="o">::</span><span class="n">stringstream</span> <span class="n">buffer</span><span class="p">(</span><span class="n">str</span><span class="p">.</span><span class="n">substr</span><span class="p">(</span><span class="n">position</span><span class="p">,</span> <span class="n">BigInteger</span><span class="o">::</span><span class="n">N</span><span class="p">));</span>
- <span class="n">ullong</span> <span class="n">digit</span><span class="p">;</span>
- <span class="n">buffer</span> <span class="o">>></span> <span class="n">digit</span><span class="p">;</span>
- <span class="n">digits</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">digit</span><span class="p">);</span>
- <span class="n">position</span> <span class="o">+=</span> <span class="n">BigInteger</span><span class="o">::</span><span class="n">N</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="n">std</span><span class="o">::</span><span class="n">reverse</span><span class="p">(</span><span class="n">digits</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">digits</span><span class="p">.</span><span class="n">end</span><span class="p">());</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span><span class="o">&</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o">+=</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">bi</span><span class="p">)</span> <span class="p">{</span>
- <span class="k">if</span> <span class="p">(</span><span class="n">digits</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o"><</span> <span class="n">bi</span><span class="p">.</span><span class="n">digits</span><span class="p">.</span><span class="n">size</span><span class="p">())</span>
- <span class="n">digits</span><span class="p">.</span><span class="n">resize</span><span class="p">(</span><span class="n">bi</span><span class="p">.</span><span class="n">digits</span><span class="p">.</span><span class="n">size</span><span class="p">());</span>
- <span class="n">ullong</span> <span class="n">carry</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
- <span class="n">std</span><span class="o">::</span><span class="n">deque</span><span class="o"><</span><span class="n">ullong</span><span class="o">>::</span><span class="n">iterator</span> <span class="n">it</span><span class="p">;</span>
- <span class="n">OperatorCarry</span><span class="o"><</span><span class="n">Add</span><span class="o">></span> <span class="n">addwc</span><span class="p">(</span><span class="n">carry</span><span class="p">);</span>
- <span class="n">it</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">transform</span><span class="p">(</span><span class="n">bi</span><span class="p">.</span><span class="n">digits</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">bi</span><span class="p">.</span><span class="n">digits</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="n">digits</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">digits</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">addwc</span><span class="p">);</span>
- <span class="n">std</span><span class="o">::</span><span class="n">transform</span><span class="p">(</span><span class="n">it</span><span class="p">,</span> <span class="n">digits</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="n">it</span><span class="p">,</span> <span class="n">Carry</span><span class="p">(</span><span class="n">carry</span><span class="p">));</span>
- <span class="k">if</span><span class="p">(</span><span class="n">carry</span><span class="p">)</span>
- <span class="n">digits</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">carry</span><span class="p">);</span>
- <span class="k">return</span> <span class="o">*</span><span class="k">this</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span><span class="o">&</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o">-=</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">bi</span><span class="p">)</span> <span class="p">{</span>
- <span class="kt">long</span> <span class="kt">long</span> <span class="n">borrow</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
- <span class="n">std</span><span class="o">::</span><span class="n">deque</span><span class="o"><</span><span class="n">ullong</span><span class="o">>::</span><span class="n">iterator</span> <span class="n">it</span><span class="p">;</span>
- <span class="n">it</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">transform</span><span class="p">(</span><span class="n">bi</span><span class="p">.</span><span class="n">digits</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">bi</span><span class="p">.</span><span class="n">digits</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="n">digits</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">digits</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">SubtractionBorrow</span><span class="p">(</span><span class="n">borrow</span><span class="p">));</span>
- <span class="n">std</span><span class="o">::</span><span class="n">transform</span><span class="p">(</span><span class="n">it</span><span class="p">,</span> <span class="n">digits</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="n">it</span><span class="p">,</span> <span class="n">Borrow</span><span class="p">(</span><span class="n">borrow</span><span class="p">));</span>
- <span class="k">return</span> <span class="o">*</span><span class="k">this</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span><span class="o">&</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o">*=</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">ullong</span> <span class="n">carry</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
- <span class="n">OperatorCarry</span><span class="o"><</span><span class="n">Multiply</span><span class="o">></span> <span class="n">mulmc</span><span class="p">(</span><span class="n">carry</span><span class="p">);</span>
- <span class="n">mulmc</span><span class="p">.</span><span class="n">k</span> <span class="o">=</span> <span class="n">n</span><span class="p">;</span>
- <span class="n">std</span><span class="o">::</span><span class="n">transform</span><span class="p">(</span><span class="n">digits</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">digits</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="n">digits</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">mulmc</span><span class="p">);</span>
- <span class="k">while</span><span class="p">(</span><span class="n">carry</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">digits</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">carry</span> <span class="o">%</span> <span class="n">BigInteger</span><span class="o">::</span><span class="n">base</span><span class="p">);</span>
- <span class="n">carry</span> <span class="o">/=</span> <span class="n">BigInteger</span><span class="o">::</span><span class="n">base</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="k">return</span> <span class="o">*</span><span class="k">this</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span><span class="o">&</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o">*=</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">bi</span><span class="p">)</span> <span class="p">{</span>
- <span class="k">const</span> <span class="n">BigInteger</span><span class="o">*</span> <span class="n">maxOp</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
- <span class="k">const</span> <span class="n">BigInteger</span><span class="o">*</span> <span class="n">minOp</span> <span class="o">=</span> <span class="o">&</span><span class="n">bi</span><span class="p">;</span>
- <span class="n">ullong</span> <span class="n">maxSize</span> <span class="o">=</span> <span class="n">maxOp</span><span class="o">-></span><span class="n">digits</span><span class="p">.</span><span class="n">size</span><span class="p">();</span>
- <span class="n">ullong</span> <span class="n">minSize</span> <span class="o">=</span> <span class="n">minOp</span><span class="o">-></span><span class="n">digits</span><span class="p">.</span><span class="n">size</span><span class="p">();</span>
- <span class="k">if</span> <span class="p">(</span><span class="n">maxSize</span> <span class="o"><</span> <span class="n">minSize</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">std</span><span class="o">::</span><span class="n">swap</span><span class="p">(</span><span class="n">maxOp</span><span class="p">,</span> <span class="n">minOp</span><span class="p">);</span>
- <span class="n">std</span><span class="o">::</span><span class="n">swap</span><span class="p">(</span><span class="n">maxSize</span><span class="p">,</span> <span class="n">minSize</span><span class="p">);</span>
- <span class="p">}</span>
- <span class="n">std</span><span class="o">::</span><span class="n">deque</span><span class="o"><</span><span class="n">BigInteger</span><span class="o">></span> <span class="n">array</span><span class="p">(</span><span class="n">minSize</span><span class="p">);</span>
- <span class="k">for</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">minSize</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">array</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">digits</span><span class="p">.</span><span class="n">resize</span><span class="p">(</span><span class="n">maxSize</span><span class="p">);</span>
- <span class="n">array</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="o">*</span><span class="n">maxOp</span> <span class="o">*</span> <span class="n">minOp</span><span class="o">-></span><span class="n">digits</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
- <span class="p">}</span>
- <span class="o">*</span><span class="k">this</span> <span class="o">=</span> <span class="n">array</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
- <span class="n">digits</span><span class="p">.</span><span class="n">resize</span><span class="p">(</span><span class="n">maxSize</span> <span class="o">+</span> <span class="n">minSize</span><span class="p">);</span>
- <span class="k">for</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">minSize</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">array</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">addZeroes</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
- <span class="o">*</span><span class="k">this</span> <span class="o">+=</span> <span class="n">array</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
- <span class="p">}</span>
- <span class="k">return</span> <span class="o">*</span><span class="k">this</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="kt">void</span> <span class="n">divideHelper</span><span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">top</span><span class="p">,</span> <span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">bot</span><span class="p">,</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">q</span><span class="p">,</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">r</span><span class="p">)</span> <span class="p">{</span>
- <span class="k">if</span><span class="p">(</span><span class="n">top</span> <span class="o"><</span> <span class="n">bot</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">q</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
- <span class="n">r</span> <span class="o">=</span> <span class="n">top</span><span class="p">;</span>
- <span class="k">return</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">top</span> <span class="o">==</span> <span class="n">bot</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">q</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
- <span class="n">r</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
- <span class="k">return</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span> <span class="n">dividend</span><span class="p">(</span><span class="n">top</span><span class="p">);</span>
- <span class="n">BigInteger</span> <span class="n">divisor</span><span class="p">(</span><span class="n">bot</span><span class="p">);</span>
- <span class="n">q</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
- <span class="n">r</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
- <span class="n">ullong</span> <span class="n">tr</span><span class="p">;</span>
- <span class="n">ullong</span> <span class="n">zero</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
- <span class="k">while</span><span class="p">(</span><span class="n">divisor</span><span class="p">.</span><span class="n">digits</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o"><</span> <span class="n">dividend</span><span class="p">.</span><span class="n">digits</span><span class="p">.</span><span class="n">size</span><span class="p">())</span> <span class="p">{</span>
- <span class="n">divisor</span> <span class="o">*=</span> <span class="n">BigInteger</span><span class="o">::</span><span class="n">base</span><span class="p">;</span>
- <span class="n">zero</span><span class="o">++</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="k">if</span><span class="p">(</span><span class="n">divisor</span> <span class="o">></span> <span class="n">dividend</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">divisor</span> <span class="o">/=</span> <span class="n">BigInteger</span><span class="o">::</span><span class="n">base</span><span class="p">;</span>
- <span class="n">zero</span><span class="o">--</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="kt">int</span> <span class="n">divisor1</span> <span class="o">=</span> <span class="n">divisor</span><span class="p">.</span><span class="n">digits</span><span class="p">[</span><span class="n">divisor</span><span class="p">.</span><span class="n">digits</span><span class="p">.</span><span class="n">size</span><span class="p">()</span><span class="o">-</span><span class="mi">1</span><span class="p">];</span>
- <span class="kt">int</span> <span class="n">dividend1</span><span class="p">;</span>
- <span class="n">BigInteger</span> <span class="n">holder</span><span class="p">;</span>
- <span class="k">for</span><span class="p">(</span><span class="n">ullong</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">k</span> <span class="o"><=</span> <span class="n">zero</span><span class="p">;</span> <span class="o">++</span><span class="n">k</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">dividend1</span> <span class="o">=</span> <span class="n">dividend</span><span class="p">.</span><span class="n">digits</span><span class="p">[</span><span class="n">dividend</span><span class="p">.</span><span class="n">digits</span><span class="p">.</span><span class="n">size</span><span class="p">()</span><span class="o">-</span><span class="mi">1</span><span class="p">];</span>
- <span class="n">tr</span> <span class="o">=</span> <span class="p">(</span><span class="n">dividend1</span><span class="o">*</span><span class="n">BigInteger</span><span class="o">::</span><span class="n">base</span> <span class="o">+</span> <span class="n">dividend</span><span class="p">.</span><span class="n">digits</span><span class="p">[</span><span class="n">dividend</span><span class="p">.</span><span class="n">digits</span><span class="p">.</span><span class="n">size</span><span class="p">()</span><span class="o">-</span><span class="mi">2</span><span class="p">])</span><span class="o">/</span><span class="n">divisor1</span><span class="p">;</span>
- <span class="k">if</span><span class="p">(</span><span class="n">BigInteger</span><span class="o">::</span><span class="n">base</span> <span class="o"><=</span> <span class="n">tr</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">tr</span> <span class="o">=</span> <span class="n">BigInteger</span><span class="o">::</span><span class="n">base</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="k">while</span><span class="p">((</span><span class="n">holder</span> <span class="o">=</span> <span class="n">divisor</span><span class="o">*</span><span class="n">tr</span><span class="p">)</span> <span class="o">></span> <span class="n">dividend</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">tr</span><span class="o">--</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="n">q</span> <span class="o">*=</span> <span class="n">BigInteger</span><span class="o">::</span><span class="n">base</span><span class="p">;</span>
- <span class="n">q</span> <span class="o">+=</span> <span class="n">tr</span><span class="p">;</span>
- <span class="n">dividend</span> <span class="o">-=</span> <span class="n">holder</span><span class="p">;</span>
- <span class="n">divisor</span> <span class="o">/=</span> <span class="n">BigInteger</span><span class="o">::</span><span class="n">base</span><span class="p">;</span>
- <span class="n">divisor1</span> <span class="o">=</span> <span class="n">divisor</span><span class="p">.</span><span class="n">digits</span><span class="p">[</span><span class="n">divisor</span><span class="p">.</span><span class="n">digits</span><span class="p">.</span><span class="n">size</span><span class="p">()</span><span class="o">-</span><span class="mi">1</span><span class="p">];</span>
- <span class="p">}</span>
- <span class="n">r</span> <span class="o">=</span> <span class="n">dividend</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span><span class="o">&</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o">/=</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">bi</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">BigInteger</span> <span class="n">q</span><span class="p">,</span> <span class="n">r</span><span class="p">;</span>
- <span class="n">divideHelper</span><span class="p">(</span><span class="o">*</span><span class="k">this</span><span class="p">,</span><span class="n">bi</span><span class="p">,</span><span class="n">q</span><span class="p">,</span><span class="n">r</span><span class="p">);</span>
- <span class="o">*</span><span class="k">this</span> <span class="o">=</span> <span class="n">q</span><span class="p">;</span>
- <span class="n">normalize</span><span class="p">();</span>
- <span class="k">return</span> <span class="o">*</span><span class="k">this</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span><span class="o">&</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o">%=</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">bi</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">BigInteger</span> <span class="n">q</span><span class="p">,</span> <span class="n">r</span><span class="p">;</span>
- <span class="n">divideHelper</span><span class="p">(</span><span class="o">*</span><span class="k">this</span><span class="p">,</span><span class="n">bi</span><span class="p">,</span><span class="n">q</span><span class="p">,</span><span class="n">r</span><span class="p">);</span>
- <span class="o">*</span><span class="k">this</span> <span class="o">=</span> <span class="n">r</span><span class="p">;</span>
- <span class="k">return</span> <span class="o">*</span><span class="k">this</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span><span class="o">&</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o">/=</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">ullong</span> <span class="n">carry</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
- <span class="n">ullong</span> <span class="n">quotient</span><span class="p">;</span>
- <span class="n">ullong</span> <span class="n">length</span> <span class="o">=</span> <span class="n">digits</span><span class="p">.</span><span class="n">size</span><span class="p">();</span>
- <span class="k">if</span><span class="p">(</span><span class="n">n</span> <span class="o">></span> <span class="n">BigInteger</span><span class="o">::</span><span class="n">base</span><span class="p">)</span> <span class="p">{</span>
- <span class="k">return</span> <span class="p">(</span><span class="o">*</span><span class="k">this</span> <span class="o">/=</span> <span class="n">BigInteger</span><span class="p">(</span><span class="n">n</span><span class="p">));</span>
- <span class="p">}</span>
- <span class="k">if</span><span class="p">(</span><span class="n">n</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
- <span class="k">throw</span> <span class="n">std</span><span class="o">::</span><span class="n">logic_error</span><span class="p">(</span><span class="s">"Division by zero"</span><span class="p">);</span>
- <span class="p">}</span>
- <span class="k">else</span> <span class="p">{</span>
- <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="n">length</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="n">k</span><span class="o">>=</span><span class="mi">0</span><span class="p">;</span> <span class="o">--</span><span class="n">k</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">quotient</span> <span class="o">=</span> <span class="p">(</span><span class="n">BigInteger</span><span class="o">::</span><span class="n">base</span><span class="o">*</span><span class="n">carry</span> <span class="o">+</span> <span class="n">digits</span><span class="p">[</span><span class="n">k</span><span class="p">]);</span>
- <span class="n">carry</span> <span class="o">=</span> <span class="n">quotient</span> <span class="o">%</span> <span class="n">n</span><span class="p">;</span>
- <span class="n">digits</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">quotient</span> <span class="o">/</span> <span class="n">n</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="p">}</span>
- <span class="n">normalize</span><span class="p">();</span>
- <span class="k">return</span> <span class="o">*</span><span class="k">this</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span><span class="o">&</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o">%=</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">BigInteger</span> <span class="n">q</span><span class="p">,</span> <span class="n">r</span><span class="p">;</span>
- <span class="n">BigInteger</span> <span class="n">l</span><span class="p">(</span><span class="n">n</span><span class="p">);</span>
- <span class="n">divideHelper</span><span class="p">(</span><span class="o">*</span><span class="k">this</span><span class="p">,</span><span class="n">l</span><span class="p">,</span><span class="n">q</span><span class="p">,</span><span class="n">r</span><span class="p">);</span>
- <span class="o">*</span><span class="k">this</span> <span class="o">=</span> <span class="n">r</span><span class="p">;</span>
- <span class="k">return</span> <span class="o">*</span><span class="k">this</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span><span class="o">&</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o"><<=</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
- <span class="k">for</span><span class="p">(</span><span class="n">ullong</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
- <span class="p">(</span><span class="o">*</span><span class="k">this</span><span class="p">)</span> <span class="o">*=</span> <span class="mi">2</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="k">return</span> <span class="o">*</span><span class="k">this</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span><span class="o">&</span> <span class="n">BigInteger</span><span class="o">::</span><span class="n">addZeroes</span><span class="p">(</span><span class="n">ullong</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">digits</span><span class="p">.</span><span class="n">resize</span><span class="p">(</span><span class="n">digits</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">+</span> <span class="n">n</span><span class="p">);</span>
- <span class="n">std</span><span class="o">::</span><span class="n">copy</span><span class="p">(</span><span class="n">digits</span><span class="p">.</span><span class="n">rbegin</span><span class="p">()</span> <span class="o">+</span> <span class="n">n</span><span class="p">,</span> <span class="n">digits</span><span class="p">.</span><span class="n">rend</span><span class="p">(),</span> <span class="n">digits</span><span class="p">.</span><span class="n">rbegin</span><span class="p">());</span>
- <span class="n">std</span><span class="o">::</span><span class="n">fill</span><span class="p">(</span><span class="n">digits</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">digits</span><span class="p">.</span><span class="n">begin</span><span class="p">()</span> <span class="o">+</span> <span class="n">n</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
- <span class="k">return</span> <span class="o">*</span><span class="k">this</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o">+</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">bi</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
- <span class="n">BigInteger</span> <span class="n">result</span><span class="p">(</span><span class="o">*</span><span class="k">this</span><span class="p">);</span>
- <span class="k">return</span> <span class="p">(</span><span class="n">result</span> <span class="o">+=</span> <span class="n">bi</span><span class="p">);</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o">-</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">bi</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
- <span class="n">BigInteger</span> <span class="n">result</span><span class="p">(</span><span class="o">*</span><span class="k">this</span><span class="p">);</span>
- <span class="k">return</span> <span class="p">(</span><span class="n">result</span> <span class="o">-=</span> <span class="n">bi</span><span class="p">);</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o">*</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">n</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
- <span class="n">BigInteger</span> <span class="n">result</span><span class="p">(</span><span class="o">*</span><span class="k">this</span><span class="p">);</span>
- <span class="k">return</span> <span class="p">(</span><span class="n">result</span> <span class="o">*=</span> <span class="n">n</span><span class="p">);</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o">/</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">bi</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
- <span class="n">BigInteger</span> <span class="n">result</span><span class="p">(</span><span class="o">*</span><span class="k">this</span><span class="p">);</span>
- <span class="k">return</span> <span class="p">(</span><span class="n">result</span> <span class="o">/=</span> <span class="n">bi</span><span class="p">);</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o">%</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">bi</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
- <span class="n">BigInteger</span> <span class="n">result</span><span class="p">(</span><span class="o">*</span><span class="k">this</span><span class="p">);</span>
- <span class="k">return</span> <span class="p">(</span><span class="n">result</span> <span class="o">%=</span> <span class="n">bi</span><span class="p">);</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o">/</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">n</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
- <span class="n">BigInteger</span> <span class="n">result</span><span class="p">(</span><span class="o">*</span><span class="k">this</span><span class="p">);</span>
- <span class="k">return</span> <span class="p">(</span><span class="n">result</span> <span class="o">/=</span> <span class="n">n</span><span class="p">);</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o">%</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">n</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
- <span class="n">BigInteger</span> <span class="n">result</span><span class="p">(</span><span class="o">*</span><span class="k">this</span><span class="p">);</span>
- <span class="k">return</span> <span class="p">(</span><span class="n">result</span> <span class="o">/=</span> <span class="n">n</span><span class="p">);</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o">*</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">bi</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
- <span class="n">BigInteger</span> <span class="n">result</span><span class="p">(</span><span class="o">*</span><span class="k">this</span><span class="p">);</span>
- <span class="k">return</span> <span class="p">(</span><span class="n">result</span> <span class="o">*=</span> <span class="n">bi</span><span class="p">);</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o"><<</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">n</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
- <span class="n">BigInteger</span> <span class="n">result</span><span class="p">(</span><span class="o">*</span><span class="k">this</span><span class="p">);</span>
- <span class="k">return</span> <span class="p">(</span><span class="n">result</span> <span class="o"><<=</span> <span class="n">n</span><span class="p">);</span>
- <span class="p">}</span>
- <span class="kt">bool</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o">==</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">other</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
- <span class="k">return</span> <span class="k">this</span><span class="o">-></span><span class="n">digits</span> <span class="o">==</span> <span class="n">other</span><span class="p">.</span><span class="n">digits</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="kt">bool</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o">==</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">other</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
- <span class="k">return</span> <span class="o">*</span><span class="k">this</span> <span class="o">==</span> <span class="n">BigInteger</span><span class="p">(</span><span class="n">other</span><span class="p">);</span>
- <span class="p">}</span>
- <span class="kt">bool</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o"><</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">other</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
- <span class="k">if</span><span class="p">(</span><span class="n">digits</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o"><</span> <span class="n">other</span><span class="p">.</span><span class="n">digits</span><span class="p">.</span><span class="n">size</span><span class="p">())</span>
- <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
- <span class="k">if</span><span class="p">(</span><span class="n">other</span><span class="p">.</span><span class="n">digits</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o"><</span> <span class="n">digits</span><span class="p">.</span><span class="n">size</span><span class="p">())</span>
- <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
- <span class="k">for</span><span class="p">(</span><span class="n">ullong</span> <span class="n">i</span> <span class="o">=</span> <span class="n">digits</span><span class="p">.</span><span class="n">size</span><span class="p">()</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">></span> <span class="mi">0</span><span class="p">;</span> <span class="o">--</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
- <span class="k">if</span><span class="p">(</span><span class="n">digits</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o"><</span> <span class="n">other</span><span class="p">.</span><span class="n">digits</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
- <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
- <span class="k">if</span><span class="p">(</span><span class="n">other</span><span class="p">.</span><span class="n">digits</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o"><</span> <span class="n">digits</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
- <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="k">return</span> <span class="n">digits</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o"><</span> <span class="n">other</span><span class="p">.</span><span class="n">digits</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
- <span class="p">}</span>
- <span class="kt">bool</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o"><</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">other</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
- <span class="k">return</span> <span class="o">*</span><span class="k">this</span> <span class="o"><</span> <span class="n">BigInteger</span><span class="p">(</span><span class="n">other</span><span class="p">);</span>
- <span class="p">}</span>
- <span class="kt">bool</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o">></span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">other</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
- <span class="k">return</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="o">*</span><span class="k">this</span> <span class="o"><</span> <span class="n">other</span><span class="p">));</span>
- <span class="p">}</span>
- <span class="kt">bool</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o">></span> <span class="p">(</span><span class="n">ullong</span> <span class="n">other</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
- <span class="k">return</span> <span class="p">(</span><span class="o">*</span><span class="k">this</span> <span class="o">></span> <span class="n">BigInteger</span><span class="p">(</span><span class="n">other</span><span class="p">));</span>
- <span class="p">}</span>
- <span class="kt">bool</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o"><=</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">other</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
- <span class="k">if</span><span class="p">(</span><span class="o">*</span><span class="k">this</span> <span class="o"><</span> <span class="n">other</span><span class="p">)</span>
- <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
- <span class="k">if</span><span class="p">(</span><span class="o">*</span><span class="k">this</span> <span class="o">==</span> <span class="n">other</span><span class="p">)</span>
- <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
- <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="kt">bool</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o"><=</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">other</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
- <span class="k">return</span> <span class="p">(</span><span class="o">*</span><span class="k">this</span> <span class="o"><=</span> <span class="n">BigInteger</span><span class="p">(</span><span class="n">other</span><span class="p">));</span>
- <span class="p">}</span>
- <span class="kt">bool</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o">>=</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">other</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
- <span class="k">if</span><span class="p">(</span><span class="o">*</span><span class="k">this</span> <span class="o">></span> <span class="n">other</span><span class="p">)</span>
- <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
- <span class="k">if</span><span class="p">(</span><span class="o">*</span><span class="k">this</span> <span class="o">==</span> <span class="n">other</span><span class="p">)</span>
- <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
- <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="kt">bool</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o">>=</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">other</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
- <span class="k">return</span> <span class="p">(</span><span class="o">*</span><span class="k">this</span> <span class="o">>=</span> <span class="n">BigInteger</span><span class="p">(</span><span class="n">other</span><span class="p">));</span>
- <span class="p">}</span>
- <span class="kt">bool</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o">!=</span> <span class="p">(</span><span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">other</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
- <span class="k">return</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="o">*</span><span class="k">this</span> <span class="o">==</span> <span class="n">other</span><span class="p">));</span>
- <span class="p">}</span>
- <span class="kt">bool</span> <span class="n">BigInteger</span><span class="o">::</span><span class="k">operator</span><span class="o">!=</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">other</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
- <span class="k">return</span> <span class="p">(</span><span class="o">*</span><span class="k">this</span> <span class="o">!=</span> <span class="n">BigInteger</span><span class="p">(</span><span class="n">other</span><span class="p">));</span>
- <span class="p">}</span>
- <span class="kt">void</span> <span class="n">BigInteger</span><span class="o">::</span><span class="n">normalize</span><span class="p">()</span> <span class="p">{</span>
- <span class="k">while</span> <span class="p">(</span><span class="n">digits</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">></span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
- <span class="k">if</span> <span class="p">(</span><span class="n">digits</span><span class="p">.</span><span class="n">back</span><span class="p">()</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
- <span class="n">digits</span><span class="p">.</span><span class="n">pop_back</span><span class="p">();</span>
- <span class="k">else</span>
- <span class="k">break</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span> <span class="k">operator</span><span class="o">+</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">n</span><span class="p">,</span> <span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">bi</span><span class="p">)</span> <span class="p">{</span>
- <span class="k">return</span> <span class="n">bi</span> <span class="o">+</span> <span class="n">n</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span> <span class="k">operator</span><span class="o">*</span> <span class="p">(</span><span class="n">ullong</span> <span class="n">n</span><span class="p">,</span> <span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">bi</span><span class="p">)</span> <span class="p">{</span>
- <span class="k">return</span> <span class="n">bi</span> <span class="o">*</span> <span class="n">n</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="n">std</span><span class="o">::</span><span class="n">ostream</span><span class="o">&</span> <span class="k">operator</span><span class="o"><<</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">ostream</span><span class="o">&</span> <span class="n">out</span><span class="p">,</span> <span class="k">const</span> <span class="n">BigInteger</span><span class="o">&</span> <span class="n">bi</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">BigInteger</span><span class="o">&</span> <span class="n">bi2</span> <span class="o">=</span> <span class="k">const_cast</span><span class="o"><</span><span class="n">BigInteger</span><span class="o">&></span><span class="p">(</span><span class="n">bi</span><span class="p">);</span>
- <span class="n">bi2</span><span class="p">.</span><span class="n">normalize</span><span class="p">();</span>
- <span class="kt">long</span> <span class="kt">long</span> <span class="n">size</span> <span class="o">=</span> <span class="n">bi</span><span class="p">.</span><span class="n">digits</span><span class="p">.</span><span class="n">size</span><span class="p">();</span>
- <span class="k">if</span> <span class="p">(</span><span class="n">bi</span><span class="p">.</span><span class="n">digits</span><span class="p">[</span><span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">])</span>
- <span class="n">out</span> <span class="o"><<</span> <span class="n">bi</span><span class="p">.</span><span class="n">digits</span><span class="p">[</span><span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">];</span>
- <span class="k">for</span><span class="p">(</span><span class="kt">long</span> <span class="kt">long</span> <span class="n">i</span> <span class="o">=</span> <span class="n">size</span> <span class="o">-</span> <span class="mi">2</span><span class="p">;</span> <span class="n">i</span> <span class="o">>=</span> <span class="mi">0</span><span class="p">;</span> <span class="o">--</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">std</span><span class="o">::</span><span class="n">stringstream</span> <span class="n">buffer</span><span class="p">;</span>
- <span class="n">buffer</span> <span class="o"><<</span> <span class="n">bi</span><span class="p">.</span><span class="n">digits</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
- <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">str</span> <span class="o">=</span> <span class="n">buffer</span><span class="p">.</span><span class="n">str</span><span class="p">();</span>
- <span class="n">ullong</span> <span class="n">toN</span> <span class="o">=</span> <span class="n">BigInteger</span><span class="o">::</span><span class="n">N</span> <span class="o">-</span> <span class="n">str</span><span class="p">.</span><span class="n">size</span><span class="p">();</span>
- <span class="k">if</span> <span class="p">(</span><span class="n">toN</span> <span class="o">></span> <span class="mi">0</span><span class="p">)</span>
- <span class="n">str</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="p">(</span><span class="n">toN</span><span class="p">,</span> <span class="sc">'0'</span><span class="p">)</span> <span class="o">+</span> <span class="n">str</span><span class="p">;</span>
- <span class="n">out</span> <span class="o"><<</span> <span class="n">str</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="k">return</span> <span class="n">out</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">BigInteger</span><span class="o">::</span><span class="n">toString</span><span class="p">()</span> <span class="p">{</span>
- <span class="n">std</span><span class="o">::</span><span class="n">stringstream</span> <span class="n">out</span><span class="p">;</span>
- <span class="kt">long</span> <span class="kt">long</span> <span class="n">size</span> <span class="o">=</span> <span class="n">digits</span><span class="p">.</span><span class="n">size</span><span class="p">();</span>
- <span class="k">if</span> <span class="p">(</span><span class="n">digits</span><span class="p">[</span><span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">])</span>
- <span class="n">out</span> <span class="o"><<</span> <span class="n">digits</span><span class="p">[</span><span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">];</span>
- <span class="k">for</span><span class="p">(</span><span class="kt">long</span> <span class="kt">long</span> <span class="n">i</span> <span class="o">=</span> <span class="n">size</span> <span class="o">-</span> <span class="mi">2</span><span class="p">;</span> <span class="n">i</span> <span class="o">>=</span> <span class="mi">0</span><span class="p">;</span> <span class="o">--</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">str</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">to_string</span><span class="p">(</span><span class="n">digits</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
- <span class="n">ullong</span> <span class="n">toN</span> <span class="o">=</span> <span class="n">BigInteger</span><span class="o">::</span><span class="n">N</span> <span class="o">-</span> <span class="n">str</span><span class="p">.</span><span class="n">size</span><span class="p">();</span>
- <span class="k">if</span> <span class="p">(</span><span class="n">toN</span> <span class="o">></span> <span class="mi">0</span><span class="p">)</span>
- <span class="n">str</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="p">(</span><span class="n">toN</span><span class="p">,</span> <span class="sc">'0'</span><span class="p">)</span> <span class="o">+</span> <span class="n">str</span><span class="p">;</span>
- <span class="n">out</span> <span class="o"><<</span> <span class="n">str</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="k">return</span> <span class="n">out</span><span class="p">.</span><span class="n">str</span><span class="p">();</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span> <span class="k">operator</span><span class="s">""</span> <span class="n">_Big</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">str</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">size_t</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
- <span class="k">return</span> <span class="n">BigInteger</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="p">(</span><span class="n">str</span><span class="p">,</span><span class="n">n</span><span class="p">));</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span> <span class="k">operator</span><span class="s">""</span> <span class="n">_Big</span><span class="p">(</span><span class="n">ullong</span> <span class="n">number</span><span class="p">)</span> <span class="p">{</span>
- <span class="k">return</span> <span class="n">BigInteger</span><span class="p">(</span><span class="n">number</span><span class="p">);</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span> <span class="n">bfactorial</span><span class="p">(</span><span class="n">ullong</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
- <span class="k">static</span> <span class="n">std</span><span class="o">::</span><span class="n">map</span><span class="o"><</span><span class="n">ullong</span><span class="p">,</span> <span class="n">BigInteger</span><span class="o">></span> <span class="n">cache</span><span class="p">;</span>
- <span class="k">static</span> <span class="n">std</span><span class="o">::</span><span class="n">map</span><span class="o"><</span><span class="n">ullong</span><span class="p">,</span> <span class="n">BigInteger</span><span class="o">>::</span><span class="n">iterator</span> <span class="n">it</span><span class="p">;</span>
- <span class="k">if</span> <span class="p">(</span><span class="n">n</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
- <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
- <span class="n">it</span> <span class="o">=</span> <span class="n">cache</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">n</span><span class="p">);</span>
- <span class="k">if</span> <span class="p">(</span><span class="n">it</span> <span class="o">!=</span> <span class="n">cache</span><span class="p">.</span><span class="n">end</span><span class="p">())</span>
- <span class="k">return</span> <span class="n">it</span><span class="o">-></span><span class="n">second</span><span class="p">;</span>
- <span class="k">else</span>
- <span class="k">return</span> <span class="n">cache</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">n</span> <span class="o">*</span> <span class="n">fact</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
- <span class="p">}</span>
- <span class="n">BigInteger</span> <span class="n">bfibonacci</span><span class="p">(</span><span class="n">ullong</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
- <span class="k">static</span> <span class="n">std</span><span class="o">::</span><span class="n">map</span><span class="o"><</span><span class="n">ullong</span><span class="p">,</span> <span class="n">BigInteger</span><span class="o">></span> <span class="n">cache</span><span class="p">;</span>
- <span class="k">static</span> <span class="n">std</span><span class="o">::</span><span class="n">map</span><span class="o"><</span><span class="n">ullong</span><span class="p">,</span> <span class="n">BigInteger</span><span class="o">>::</span><span class="n">iterator</span> <span class="n">it</span><span class="p">;</span>
- <span class="k">if</span><span class="p">(</span><span class="n">n</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
- <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
- <span class="k">if</span><span class="p">(</span><span class="n">n</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span>
- <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
- <span class="n">it</span> <span class="o">=</span> <span class="n">cache</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">n</span><span class="p">);</span>
- <span class="k">if</span><span class="p">(</span><span class="n">it</span> <span class="o">!=</span> <span class="n">cache</span><span class="p">.</span><span class="n">end</span><span class="p">())</span>
- <span class="k">return</span> <span class="n">it</span><span class="o">-></span><span class="n">second</span><span class="p">;</span>
- <span class="k">else</span>
- <span class="k">return</span> <span class="n">cache</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">fibonacci</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">fibonacci</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">2</span><span class="p">);</span>
- <span class="p">}</span>
- <span class="p">}</span> <span class="c1">//namespace gears</span>
- <span class="cp">#endif </span><span class="c1">//GEARS_BIG_INTEGER_HPP</span>
- </pre></div></body>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement