天天看點

2、大數相加減

2、大數相加減

以前寫過一篇日志,不過寫的不是很全。

<a href="http://blog.163.com/zhoumhan_0351/blog/static/399542272010328112344940/">http://blog.163.com/zhoumhan_0351/blog/static/399542272010328112344940/</a>

今天重寫一下,如下:

// JSON.cpp : 定義控制台應用程式的入口點。

//

#include "iostream"

using namespace std;

const int M = 1000; //先将定最大是位,如果要更大值,可以更改這個值

int num1[M] = {0}, num2[M] = {0}, num3[M] = {0}; //存放兩個數及生成結果

int n1 = 0, n2 = 0, n3 = 0; //相加的兩個數和位數,及結果位數

char cn1[M] = "", cn2[M] = ""; //輸入的存放兩個數的字元串

int flag1 = 0, flag2 = 0, flag3 = 0; //0表示是正數,表示是負數

char *p1 = NULL, *p2 = NULL; //實際做運算的兩個字元串

int tmpflag = 0; //來記錄是應當加,還是減運算,0表示相加,表示相減

bool reverseIt = false; //來标志是否需要反轉,false表示不需要,true表示需要

/*

void calculateMulti()

{ //大數相乘算法

for (int i = 0; i &lt; n1; i++)

for (int j = 0; j &lt; n2; j++)

{

int temp = num1[i] * num2[j];

num3[i + j] = num3[i + j] + temp; //處理目前位

int temp1 = num3[i + j];

num3[i + j] = temp1 % 10;

num3[i + j + 1] += (temp1 / 10); //處理高位

int temp2 = num3[i + j + 1];

num3[i + j + 1] = temp2 % 10;

num3[i + j + 2] += temp2 / 10; //處理次高位

int k = 2;

//while (num3[i + j + k] &gt; 10 &amp;&amp; (i + j + k) &lt; (n1 + n2 -1))

// {

// int tempme = num3[i + j + k];

// num3[i + j + k] = tempme % 10;

// num3[i + j + k + 1] += tempme / 10; //依此處理次高位,直到最後。

// k++;

// }

}

if (0 == num3[n1+n2-1])

n3 = n1 + n2 -2;

else 

n3 = n1 + n2 -1;

for (int i = n3; i &gt;= 0; i--)

cout &lt;&lt; num3[i];

cout &lt;&lt; endl;

*/

void calculateAdd()

n3 = n1 &gt; n2 ? n1 : n2;

for (int i = 0; i &lt; n3; i++)

int temp = num1[i] + num2[i];

num3[i] = num3[i] + temp; //處理目前位

int temp1 = num3[i];

num3[i] = temp1 % 10;

num3[i + 1] += (temp1 / 10); //處理高位

if (0 == num3[n3]) //決定和是幾位

n3 = n3 - 1;

n3 = n3;

if (1 == flag3)

cout &lt;&lt; "-";

void calculateSubA(int num1[], int num2[])

///* 

int temp = num1[i] - num2[i];

if ((temp1 &lt; 0) &amp;&amp; ((i + 1) &lt; n3))

num3[i + 1] -= 1;

num3[i] = (temp1 + 10) % 10;

void convert(char cn1[], char cn2[], int n1, int n2)

int count = 0;

for (int i = n1-1; i &gt;= 0; i--)

num1[count++] = p1[i] - '0';

count = 0;

for (int i = n2-1; i &gt;= 0; i--)

num2[count++] = p2[i] - '0';

int doifalpha()

for (int i =0; i &lt; n1; i++)

if (isdigit(cn1[i]) || ('-' == cn1[0]) || ('+' == cn1[0])) 

continue;

cout &lt;&lt; "you input include no digit alpha, please input again." &lt;&lt; endl;

return -1;

for (int i =0; i &lt; n2; i++)

if (isdigit(cn2[i]) || ('-' == cn2[0]) || ('+' == cn2[0])) 

return 0;

void calculateSub(int num1[], int num2[])

 calculateSubA(num1, num2);

 if (flag3 == 1)

  cout &lt;&lt; '-';

 for (int i = n3-1; i &gt;= 0;i--)

  cout &lt;&lt; num3[i];

 cout &lt;&lt;endl;

void PreDeal(char cn1[], char cn2[], int &amp;n1, int &amp;n2)

{ //前期處理

 p1 = cn1;

 p2 = cn2;

 if (cn1[0] == '-') //第一個數是負數

 {

  flag1 = 1;

  n1--;

  p1++;

 }

 else if (cn1[0] == '+') //第一個數是正數

  flag1 = 0;

 else

  flag1 = 0; //正數

 if (cn2[0] == '-') //第二個數是負數

  flag2 = 1;

  n2--;

  p2++;

 else if (cn2[0] == '+') //第二個數是正數

  flag2 = 0;

  flag2 = 0; //正數

void DecideZF()

{ //來決定結果是正或負

 int tempflag3 = strcmp(p1, p2);

 //兩個數都是負數,我們執行相加運算

 if ((1 == flag1) &amp;&amp; (1 == flag2))

  tmpflag = 0; //相加運算

  flag3 = 1; //結果是負的

 //兩個都是正的,招待相加運算

 if ((0 == flag1) &amp;&amp; (0 == flag2))

  tmpflag = 0;

  flag3 = 0;

 //第一個是正的,第二個是負的

 if ((0 == flag1) &amp;&amp; (1 == flag2))

  tmpflag = 1;//執行減運算

  if ((n1 &gt; n2) || ((n1 == n2) &amp;&amp; (tempflag3 &gt; 0)))

  {

 flag3 = 0; //正數

reverseIt = false;//第一個數大,不需要反轉

flag3 = 1;

reverseIt = true;//需要反轉

//第一個是負的,第二個是正的

if ((1 == flag1) &amp;&amp; (0 == flag2))

tmpflag = 1;//執行減運算

if ((n1 &gt; n2) || ((n1 == n2) &amp;&amp; (tempflag3 &gt; 0)))

flag3 = 1; //負數

flag3 = 0;

void DoTheOperation()

if (tmpflag == 1) //減運算

if (true == reverseIt) //要反轉

calculateSub(num2, num1); //這是相減算法

calculateSub(num1, num2); //這是相減算法

else

//加運算

calculateAdd();

int main(int argc, char* argv[])

while(1)

memset(num3, 0, M);

memset(num1, 0, M);

memset(num2, 0, M);

memset(cn1, ' ', M);

memset(cn2, ' ', M);

cout &lt;&lt; "Input two num:" &lt;&lt; endl;

cin &gt;&gt; cn1 &gt;&gt; cn2;

n1 = (int)strlen(cn1);

n2 = (int)strlen(cn2);

int ret = doifalpha(); //是否輸入非法

if (ret == -1) return ret;

PreDeal(cn1, cn2, n1, n2);

DecideZF();

convert(cn1, cn2, n1, n2);

//calculateMulti(); //這是相乘算法

//calculateAdd();

DoTheOperation(); //進行運算

感興趣可以到CSDN論壇上讨論一下:

<a href="http://topic.csdn.net/u/20100827/17/5817b294-d1ad-4da1-af7c-f1fe0187639f.html">http://topic.csdn.net/u/20100827/17/5817b294-d1ad-4da1-af7c-f1fe0187639f.html</a>

繼續閱讀