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 < n1; i++)
for (int j = 0; j < 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] > 10 && (i + j + k) < (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 >= 0; i--)
cout << num3[i];
cout << endl;
*/
void calculateAdd()
n3 = n1 > n2 ? n1 : n2;
for (int i = 0; i < 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 << "-";
void calculateSubA(int num1[], int num2[])
///*
int temp = num1[i] - num2[i];
if ((temp1 < 0) && ((i + 1) < 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 >= 0; i--)
num1[count++] = p1[i] - '0';
count = 0;
for (int i = n2-1; i >= 0; i--)
num2[count++] = p2[i] - '0';
int doifalpha()
for (int i =0; i < n1; i++)
if (isdigit(cn1[i]) || ('-' == cn1[0]) || ('+' == cn1[0]))
continue;
cout << "you input include no digit alpha, please input again." << endl;
return -1;
for (int i =0; i < 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 << '-';
for (int i = n3-1; i >= 0;i--)
cout << num3[i];
cout <<endl;
void PreDeal(char cn1[], char cn2[], int &n1, int &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) && (1 == flag2))
tmpflag = 0; //相加運算
flag3 = 1; //結果是負的
//兩個都是正的,招待相加運算
if ((0 == flag1) && (0 == flag2))
tmpflag = 0;
flag3 = 0;
//第一個是正的,第二個是負的
if ((0 == flag1) && (1 == flag2))
tmpflag = 1;//執行減運算
if ((n1 > n2) || ((n1 == n2) && (tempflag3 > 0)))
{
flag3 = 0; //正數
reverseIt = false;//第一個數大,不需要反轉
flag3 = 1;
reverseIt = true;//需要反轉
//第一個是負的,第二個是正的
if ((1 == flag1) && (0 == flag2))
tmpflag = 1;//執行減運算
if ((n1 > n2) || ((n1 == n2) && (tempflag3 > 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 << "Input two num:" << endl;
cin >> cn1 >> 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>