C++學習--整型大數加法
阿新 • • 發佈:2018-11-17
無論整型還是長整型,都有它的極限,但有時需要運算很大的數,超過整型的極限。那就需要用字串儲存加數,再進行運算。
在C++學習的環境下,我把寫的函式都封裝在一個類中,提供一個函式介面供外部使用。
我的思想是:找出兩個數較長的,來確定結果字串的長度,預留一位進位,所以結果字串的長度會比兩個加數的長度大1,最後判斷是否去掉首位的字元0。
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> //大數加法 class intaddint { private: char *str1; char *str2; //封裝為私有 void cmp_str();//比較兩個加數哪個更長 void int_sum(char *, char *);//計算結果 public: intaddint(char *, char *); void get_res(); ~intaddint(); }; intaddint::intaddint(char *str1, char *str2) { this->str1 = new char[100];//分配記憶體 this->str2 = new char[100]; memset(this->str1, 0, 100);//清空 memset(this->str2, 0, 100); strcpy(this->str1, str1);//拷貝要進行運算的數 strcpy(this->str2, str2); } void intaddint::cmp_str() { int len1 = strlen(str1); int len2 = strlen(str2); std::cout << str1 << '+' << str2; if (len1 >= len2) int_sum(str1, str2); else int_sum(str2, str1); } void intaddint::int_sum(char *longstr, char *shortstr)//長加數放在前面 { int len1 = strlen(longstr); int len2 = strlen(shortstr); //轉化成數字進行運算 for (int i = 0; i < len1; i++) longstr[i] -= '0'; for (int i = 0; i < len2; i++) shortstr[i] -= '0'; char res[100] = { 0 }; int str1_index = len1 - 1;//加數1索引 int str2_index = len2 - 1;//加數2索引 int res_index = len1;//結果的索引,預留一位進位 for (; str2_index >= 0; str2_index--, str1_index--) { res[res_index] += longstr[str1_index] + shortstr[str2_index]; if (res[res_index] >= 10)//進位 { res[res_index - 1] += res[res_index] / 10;//取出進位的值 res[res_index] %= 10;//取模 } res_index--; } if (len1 != len2)//兩個加數位數不同需要加上沒有進行運算的數 { while (str1_index >= 0) { res[res_index] += longstr[str1_index]; if (res[res_index] >= 10)//進位 { res[res_index - 1] += res[res_index] / 10;//取出進位的值 res[res_index] %= 10;//取模 } res_index--; str1_index--; } } for (res_index = 0; res_index < len1 + 1; res_index++)//再轉為字元數字 res[res_index] += '0'; res_index = 0; while (res[res_index] == '0')//去掉前面的字元'0' res_index++; char res_t[100] = { 0 }; int t_index = 0; for (; res_index < len1 + 1; res_index++, t_index++)//用新的字串儲存結果 res_t[t_index] = res[res_index]; std::cout << '=' << res_t << std::endl; } void intaddint::get_res() { cmp_str(); } intaddint::~intaddint() { delete[]str1;//清空記憶體 delete[]str2; str1 = NULL;//防止野指標 str2 = NULL; } void main() { char *str1 = "12345678910111213"; char *str2 = "12345678910"; intaddint i(str1, str2); i.get_res(); system("pause"); }