天天看点

超长正整数相加

请设计一个算法完成两个超长正整数的加法。用字符串来解决,按位加然后考虑进位就OK。

下面是代码实现:

<code>#ifndef _ADDLONGINTERGER_</code>

<code>#define _ADDLONGINTERGER_</code>

<code>/*================================ Macros ===================================*/</code>

<code>#define FALSE  0</code>

<code>#define TURE 1</code>

<code>/*============================= Include Function ===============================*/</code>

<code>int</code> <code>AddLongInteger(</code><code>char</code> <code>*addend, </code><code>char</code> <code>*augend,</code><code>char</code> <code>*result);</code>

<code>#endif//_ADDLONGINTERGER_</code>

<code>#include"AddLongInteger.h"</code>

<code>#include&lt;string.h&gt;</code>

<code>/***********************************************************/</code>

<code>/************函数名:AddCharInerger*************************/</code>

<code>/************入口参数:加数字符和被加数字符*****************/</code>

<code>/************返回值:相加结果*******************************/</code>

<code>/************函数功能:求两个数相加结果*********************/</code>

<code>static</code> <code>int</code> <code>AddCharInerger(</code><code>char</code> <code>addend,</code><code>char</code> <code>augend)</code>

<code>{</code>

<code>    </code><code>int</code>  <code>ret = (addend -</code><code>'0'</code><code>) + (augend - </code><code>'0'</code><code>);</code>

<code>    </code><code>return</code> <code>ret;</code>

<code>}</code>

<code>/************函数名:AddLongInteger*************************/</code>

<code>/************入口参数:加数字符串和被加数字符串*************/</code>

<code>/************函数功能:求两个超长数相加*********************/</code>

<code>int</code> <code>AddLongInteger(</code><code>char</code> <code>*addend,</code><code>char</code> <code>*augend,</code><code>char</code> <code>*result)</code>

<code>    </code><code>int</code> <code>index = 0;</code>

<code>    </code><code>int</code> <code>tmp = 0;</code>

<code>    </code><code>int</code> <code>sizeAddend = </code><code>strlen</code><code>(addend);</code>

<code>    </code><code>int</code> <code>sizeAugend = </code><code>strlen</code><code>(augend);</code>

<code>    </code><code>int</code> <code>tempNumber = sizeAddend;</code>

<code>    </code><code>//判断是否正确输入</code>

<code>    </code><code>if</code><code>((NULL == addend)&amp;&amp;(NULL == augend)&amp;&amp;(NULL == result))</code>

<code>    </code><code>{</code>

<code>        </code><code>return</code> <code>FALSE;</code>

<code>    </code><code>}</code>

<code>    </code><code>if</code><code>(tempNumber &lt;= sizeAugend)</code>

<code>        </code><code>tempNumber = sizeAugend;</code>

<code>    </code><code>while</code><code>(tempNumber)</code>

<code>        </code><code>int</code> <code>temp = AddCharInerger(addend[sizeAddend-1],augend[sizeAugend-1])+tmp;</code>

<code>        </code><code>//判断是否要进位</code>

<code>        </code><code>if</code><code>(temp &gt;= 10)</code>

<code>        </code><code>{</code>

<code>            </code><code>result[index] = temp%10 + </code><code>'0'</code><code>;</code>

<code>            </code><code>tmp = temp/10;</code>

<code>        </code><code>}</code>

<code>        </code><code>else</code>

<code>            </code><code>tmp = 0;</code>

<code>            </code><code>result[index] = temp + </code><code>'0'</code><code>;</code>

<code>        </code><code>index++;</code>

<code>        </code><code>sizeAddend--;</code>

<code>        </code><code>//判断是否越界</code>

<code>        </code><code>if</code><code>(sizeAddend == 0)</code>

<code>            </code><code>sizeAddend += 1;</code>

<code>            </code><code>addend[sizeAddend-1] = </code><code>'0'</code><code>;</code>

<code>        </code><code>sizeAugend--;</code>

<code>        </code><code>if</code><code>(sizeAugend == 0)</code>

<code>            </code><code>sizeAugend += 1;</code>

<code>            </code><code>augend[sizeAugend-1] = </code><code>'0'</code><code>;</code>

<code>        </code><code>tempNumber--;</code>

<code>    </code><code>//最后是否有进位</code>

<code>    </code><code>if</code><code>(tmp &gt; 0)</code>

<code>        </code><code>result[index] = (tmp + </code><code>'0'</code><code>);</code>

<code>        </code><code>result[index+1] = </code><code>'\0'</code><code>;</code>

<code>    </code><code>else</code>

<code>        </code><code>result[index] = </code><code>'\0'</code><code>;</code>

<code>    </code><code>return</code> <code>TURE;</code>

<code>#include&lt;stdio.h&gt;</code>

<code>#include&lt;stdlib.h&gt;</code>

<code>/************函数名:inputArray*****************************/</code>

<code>/************入口参数:加数字符串和被加数字符串和结果*********/</code>

<code>/************返回值:判断是否成功***************************/</code>

<code>/************函数功能:输入*********************************/</code>

<code>/**********************************************************/</code>

<code>int</code> <code>inputArrayM(</code><code>char</code> <code>**addend,</code><code>char</code> <code>**augend,</code><code>char</code> <code>**result)</code>

<code>    </code><code>char</code> <code>ch = 0;</code>

<code>    </code><code>int</code> <code>countAddend = 0;</code>

<code>    </code><code>int</code> <code>countAugend = 0;</code>

<code>    </code><code>printf</code><code>(</code><code>"请输入加数:"</code><code>);</code>

<code>    </code><code>*addend = (</code><code>char</code> <code>*)</code><code>malloc</code><code>(</code><code>sizeof</code><code>(</code><code>char</code><code>));</code>

<code>    </code><code>if</code><code>(NULL == *addend)</code>

<code>    </code><code>while</code><code>((ch = </code><code>getchar</code><code>()) != </code><code>'\n'</code><code>)</code>

<code>        </code> 

<code>        </code><code>*(*addend+countAddend) = ch;</code>

<code>        </code><code>countAddend++;</code>

<code>        </code><code>*addend = (</code><code>char</code> <code>*)</code><code>realloc</code><code>(*addend,(countAddend+1)*</code><code>sizeof</code><code>(</code><code>char</code><code>));</code>

<code>        </code><code>if</code><code>(NULL == *addend)</code>

<code>            </code><code>return</code> <code>FALSE;</code>

<code>    </code><code>*((*addend)+countAddend) = </code><code>'\0'</code><code>;</code>

<code>    </code><code>printf</code><code>(</code><code>"请输入被加数:"</code><code>);</code>

<code>    </code><code>*augend = (</code><code>char</code> <code>*)</code><code>malloc</code><code>(</code><code>sizeof</code><code>(</code><code>char</code><code>));</code>

<code>        </code><code>*(*augend+countAugend) = ch;</code>

<code>        </code><code>countAugend++;</code>

<code>        </code><code>*augend = (</code><code>char</code> <code>*)</code><code>realloc</code><code>(*augend,(countAugend+1)*</code><code>sizeof</code><code>(</code><code>char</code><code>));</code>

<code>    </code><code>*((*augend)+countAugend) = </code><code>'\0'</code><code>;</code>

<code>    </code><code>if</code><code>(countAugend &gt; countAddend)</code>

<code>        </code><code>*result = (</code><code>char</code> <code>*)</code><code>malloc</code><code>((countAugend+3)*</code><code>sizeof</code><code>(</code><code>char</code><code>));</code>

<code>        </code><code>*result = (</code><code>char</code> <code>*)</code><code>malloc</code><code>((countAddend+3)*</code><code>sizeof</code><code>(</code><code>char</code><code>));</code>

<code>/*</code>

<code>程序的入口main</code>

<code>*/</code>

<code>int</code> <code>main()</code>

<code>    </code><code>char</code> <code>*addend = NULL;</code>

<code>    </code><code>char</code> <code>*augend = NULL;</code>

<code>    </code><code>char</code> <code>*result = NULL;</code>

<code>    </code><code>inputArrayM(&amp;addend,&amp;augend,&amp;result);</code>

<code>    </code><code>if</code><code>(FALSE == AddLongInteger(addend,augend,result))</code>

<code>        </code><code>printf</code><code>(</code><code>"计算出错\n"</code><code>);</code>

<code>        </code><code>return</code> <code>0;</code>

<code>    </code><code>index = </code><code>strlen</code><code>(result)-1;</code>

<code>    </code><code>for</code><code>(;index&gt;=0;index--)</code>

<code>        </code><code>printf</code><code>(</code><code>"%c"</code><code>,result[index]);</code>

<code>    </code><code>printf</code><code>(</code><code>"\n"</code><code>);</code>

<code>    </code><code>system</code><code>(</code><code>"pause"</code><code>);</code>

<code>    </code><code>free</code><code>(addend);</code>

<code>    </code><code>free</code><code>(augend);</code>

<code>    </code><code>free</code><code>(result);</code>

<code>    </code><code>return</code> <code>0;</code>

本文转自 8yi少女的夢 51CTO博客,原文链接:http://blog.51cto.com/zhaoxiaohu/1752316,如需转载请自行联系原作者

继续阅读