性价比最高网站建设价格,大数据平台网站建设,株洲建设网站的公司,网站建设 需求确认书#x1f4df;作者主页#xff1a;慢热的陕西人 #x1f334;专栏链接#xff1a;C算法 #x1f4e3;欢迎各位大佬#x1f44d;点赞#x1f525;关注#x1f693;收藏#xff0c;#x1f349;留言 主要讲解了高精度算法的四种常用的计算 文章目录 Ⅲ. 高精度Ⅲ. Ⅰ . … 作者主页慢热的陕西人 专栏链接C算法 欢迎各位大佬点赞关注收藏留言 主要讲解了高精度算法的四种常用的计算 文章目录 Ⅲ. 高精度Ⅲ. Ⅰ . A BⅢ. Ⅱ . A - BⅢ. Ⅲ. A * bⅢ. Ⅲ. A / b: Ⅲ. 高精度
以下数字均指位数
①A B精度均在10^6
②A - B 精度均在10^6
③A * b (len(A) 10^6, a 1000);
④A / b (len(A) 10^6, a 1000);
Ⅲ. Ⅰ . A B 思路将两个大数先用字符串保存然后再倒序存入到数组中这是因为我们在运算的时候会产生进位。然后再实现一个add函数实现加法将运算的结果存储到一个数组中 代码 #include iostream
#include vectorusing namespace std;vectorint add(vectorint A, vectorint B)
{vectorint C;int t 0;for (int i 0; i A.size() || i B.size(); i){if (i A.size()) t A[i];if (i B.size()) t B[i];C.push_back(t % 10);t / 10;}if (t) C.push_back(1);return C;
}int main()
{string a, b;vectorint A, B;cin a b; //将A和B存储在a和b的字符串中for (int i a.size() - 1; i 0; --i) A.push_back(a[i] - 0);for (int i b.size() - 1; i 0; --i) B.push_back(b[i] - 0);auto C add(A, B);for (int i C.size() - 1; i 0; --i) printf(%d, C[i]);return 0;
}Ⅲ. Ⅱ . A - B 思路存储思路都是统一的需要一个借位t. 每一位的计算x Ai - Bi - t,如果x大于零那么本位减法的结果就是x,如果x小于零那么需要在x结果的基础上加上10 总结果的计算如果A B那么结果就是A - B如果A b那么结果就是-(B - A) 在计算之前我们要保证每次都是大数减小数所以要先实现一个cmp函数来比较哪一个数字大。 代码 #include iostream
#include vectorusing namespace std;
bool cmp(vectorint A, vectorint B)
{//位数不同if (A.size() ! B.size()) return A.size() B.size();//位数相同for (int i A.size() - 1; i 0; --i)if (A[i] ! B[i]) return A[i] B[i];return true;
}vectorint sub(vectorint A, vectorint B)
{vector int C;for (int i 0, t 0; i A.size(); i){//将借位除去t A[i] - t;//计算本位if (i B.size()) t - B[i];C.push_back((t 10) % 10);if (t 0) t 1;elset 0;}//去除前导零while (C.size() 1 C.back() 0) C.pop_back();return C;
}int main()
{string a, b;vectorint A, B;cin a b; //将A和B存储在a和b的字符串中for (int i a.size() - 1; i 0; --i) A.push_back(a[i] - 0);for (int i b.size() - 1; i 0; --i) B.push_back(b[i] - 0);if (cmp(A, B)){auto C sub(A, B);for (int i C.size() - 1; i 0; --i) printf(%d, C[i]);}else{auto C sub(B, A);printf(-);for (int i C.size() - 1; i 0; --i) printf(%d, C[i]);}return 0;
}Ⅲ. Ⅲ. A * b 思路存储数据的思路不变特别的点在于对进位和本位计算的处理。 例如我们要计算123 * 12。 首先我们将3 * 12 t 存到t里面那么本位就是t % 10 6 , 而进位就是t / 10 3 ; 以此类推将2 * 12 t 存到t里面那么本位就是t % 10 7而进位就是t / 10 2; 最后我们将1 * 12 t 存到t里面那么本位就是t % 10 4, 而进位就是t / 10 1 最后如果t不为零的话那么最高位的值就是继续将t进行分解。 代码 #include iostream
#include vectorusing namespace std;vectorint mul(vectorint A,int b)
{vector int C;for (int i 0, t 0; t || i A.size(); i){if (i A.size()) t A[i] * b;C.push_back(t % 10);t / 10;}return C;
}int main()
{string a;int b;vectorint A;cin a b; //将A和B存储在a和b的字符串中for (int i a.size() - 1; i 0; --i) A.push_back(a[i] - 0);auto C mul(A, b);for (int i C.size() - 1; i 0; --i) printf(%d, C[i]);return 0;
}Ⅲ. Ⅲ. A / b: 思路A / B 的话我们是从高位开始计算的而且计算机每次只能计算一位。 那么我们每次计算都将余数存储在r中然后每次都将r * 10最后再加上除数的本位然后再次计算余数直到除数计算完成。 代码 #include iostream
#include vectorusing namespace std;//A 是除数 b是被除数r是余数
vectorint div(vectorint A,int b, int r)
{vector int C;r 0;for (int i A.size() - 1; i 0; --i){r r * 10 A[i];C.push_back(r / b);r % b;}//反转为标准的存储格式reverse(C.begin(),C.end());//去掉前导零while (C.size() 1 C.back() 0) C.pop_back();return C;
}int main()
{string a;int b;int r 0;vectorint A;cin a b; //将A和B存储在a和b的字符串中for (int i a.size() - 1; i 0; --i) A.push_back(a[i] - 0);auto C div(A, b, r);for (int i C.size() - 1; i 0; --i) printf(%d, C[i]);cout endl r;return 0;
}到这本篇博客的内容就到此结束了。 如果觉得本篇博客内容对你有所帮助的话可以点赞收藏顺便关注一下 如果文章内容有错误欢迎在评论区指正