1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > C++ 解决大数运算(大数加法 大数幂运算 大数求余)

C++ 解决大数运算(大数加法 大数幂运算 大数求余)

时间:2021-08-15 19:24:32

相关推荐

C++ 解决大数运算(大数加法 大数幂运算 大数求余)

文章目录

1. 大数加法2. 大数幂运算3.大数求余

废话不多说,直接上代码了。

1. 大数加法

string getCountAdd(string a, string b){string c = "";int bit = -1; //判断是否进位 -1为否,其他为进位数int i = a.length()-1; //获得a字符串长度int j = b.length()-1; //获得b字符串长度//第一种情况 两者都处理完while (i != -1 && j != -1){int t1 = a[i] - 48; int t2 = b[j] - 48;//不存在进位if (bit == -1){if (t1 + t2 >= 10){int d = (t1 + t2) % 10;c.insert(0, 1, d + 48);bit = (t1 + t2) / 10;}else{c.insert(0, 1, t1 + t2 + 48);}}//存在进位else{if (t1 + t2 + bit >= 10){int d = (t1 + t2 + bit) % 10;c.insert(0, 1, d + 48);bit = (t1 + t2 + bit) / 10;}else{c.insert(0, 1, t1 + t2 + bit + 48);bit = -1;}}i--;j--;}//第二种情况 前者处理完while (i == -1 && j != -1){int t2 = b[j] - 48;if (bit == -1){c.insert(0, 1, b[j]);}else{if (t2 + bit >= 10){int d = (t2 + bit) % 10;c.insert(0, 1, d + 48);bit = (t2 + bit) / 10;}else{c.insert(0, 1, t2 + bit + 48);bit = - 1;}}j--;}//第三种情况 后者处理完while (i != -1 && j == -1){int t1 = a[i] - 48;if (bit == -1){c.insert(0, 1, a[i]);}else{if (t1 + bit >= 10){int d = (t1 + bit) % 10;c.insert(0, 1, d + 48);bit = (t1 + bit) / 10;}else{c.insert(0, 1, t1 + bit + 48);bit = -1;}}i--;}//最后再判断是否存在进位if (bit != -1){c.insert(0, 1, bit + 48);}bit = -1;return c;}

2. 大数幂运算

string getCountExp(int a, int b){string a1 = to_string(a);int i = a1.length()-1;//a的最后下角标//m位数*n位数长度不会超过m+n位string temp = a1; //temp一直变化string temp_2 = "0";int bitcount = 0; //判断当前位数int bit = -1;//判断是否存在进位string * arr = new string[a1.length()];//保存每次计算的数int arr_i = 0;for (int x = 1; x < b; x++)//几次方就循环几次{while (i != -1)//乘数的位数{//temp * a1int t1 = a1[i] - 48;int j = temp.length() - 1;//temp的最后下角标for (int z = 0; z < bitcount; z++){arr[arr_i].insert(0, 1, '0');}while (j != -1)//temp的位数{int t2 = temp[j] - 48;if (bit == -1)//判断是否有进位{if (t1*t2 >= 10){int d = (t1*t2) % 10;arr[arr_i].insert(0, 1, d + 48);int d_2 = (t1*t2) / 10;bit = d_2;}else{int d = t1*t2;arr[arr_i].insert(0, 1, d + 48);}}else{if ((t1*t2)+bit >= 10){int d = ((t1*t2) + bit) % 10;arr[arr_i].insert(0, 1, d + 48);int d_2 = ((t1*t2) + bit) / 10;bit = d_2;}else{int d = (t1*t2) + bit;arr[arr_i].insert(0, 1, d + 48);bit = -1;}}j--;}if (bit != -1){arr[arr_i].insert(0, 1, bit + 48);bit = -1;}//走完一圈//计算每一位的数,最后相加//temp_2=temp_2+arr[arr_i];temp_2 = getCountAdd(temp_2, arr[arr_i]);bitcount++;arr_i++;i--;}bitcount = 0;temp = temp_2;temp_2 = "0";//temp_2 = "0";for (int z = 0; z < arr_i; z++){arr[z] = "";}arr_i = 0;i = a1.length() - 1;//a的最后下角标}return temp;}

3.大数求余

int getCountMod(string a, int b){int bit = -1; //判断是否需要进位//例如4255%5int i = 0;while (i < a.length()){int t1 = a[i] - 48;if (bit == -1){if (t1%b > 0){bit = t1%b;}}else{if (((bit * 10) + t1) % b>=0){bit = ((bit * 10) + t1) % b;}}i++;}if (bit != -1){return bit;}else{return 0;}return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。