您的位置:首页 > 财经 > 金融 > 互联网小项目_美食网站的设计与制作代码_游戏优化_网站发布与推广方案

互联网小项目_美食网站的设计与制作代码_游戏优化_网站发布与推广方案

2024/10/31 6:58:49 来源:https://blog.csdn.net/Zyt527659_y/article/details/143374004  浏览:    关键词:互联网小项目_美食网站的设计与制作代码_游戏优化_网站发布与推广方案
互联网小项目_美食网站的设计与制作代码_游戏优化_网站发布与推广方案

引言

此篇是专栏信息学杂谈第七篇高精度计算(加 & 减),较详细的讲解了C++中应该如何实现高精度的加减运算

高精度计算

利用计算机进行数值计算,有时会遇到这样的问题:有些计算要求精度高,希望计算的数的位数可达几十位甚至几百位,虽然计算机的计算精度较高,但因受到硬件的限制,往往达不到实际问题所要求的精度。我们可以利用程序设计的方法去实现这样的高精度计算。介绍常用的几种高精度计算的方法。

数据的接收方法和存储方法

当输入的数很长时,可采用宇符串方式输入,这样可输入很长的数,利用字符串函数中操作运算,将每一位数取出,存入数组中。

void init(int a[]) { //传入一个数组string s;cin >> s; //读入字符串sint lens = s.size();for (int i = 0; i < lens; i++) {a[i] = s[lens - 1 - i] - '0'; //将数串s转换为数组a,并倒序存储}
}

例:

在这里插入图片描述

如果我们用数组A、B分别存储加数和被加数,用数组C存储结果。

则上例有A[1]=6,A[2]=5, A[3]-8,B[1]=5, B[2]=5, B[3]=2, C[4]=1, C[3]=1,C[2]=1,C[1]=1 两数相加如下图近示

在这里插入图片描述

确定位数

接收时往往是用字符串的,所以它的位数就等于字符串的长度

运算

  • 加法进位
c[i] += a[i] + b[i];
if (c[i] >= 10) {c[i] %= 10;c[i + 1]++;
}

完整代码:

#include <iostream>
using namespace std;
int main() {ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);//快读string s1, s2, str;int a[10000], b[10000], c[100001];cin >> s1 >> s2;int len1 = (int) s1.length(), len2 = (int) s2.length();// 反向存储for (int i = 0; i < len1; i++) {a[i] = s1[len1 - i - 1] - '0';}for (int i = 0; i < len2; i++) {b[i] = s2[len2 - i - 1] - '0';}// 计算int len = max(len1, len2);for (int i = 0; i < len; i++) {c[i] += a[i] + b[i];if (c[i] >= 10) {c[i] %= 10;c[i + 1]++;}}// 删除前导0while (c[len] == 0 && len > 0) {len--;}//反向存储for (int i = len; i >= 0; i--) {str += to_string(c[i]);}cout << str;//输出return 0;
}

  • 减法借位:
if (a[i] < b[i]) {a[i + 1]--;a[i] += 10;
}
c[i] = a[i] - b[i];

完整代码

#include <iostream>
using namespace std;
int main() {ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);//快读string s1, s2, str;int a[10000], b[10000], c[100001];cin >> s1 >> s2;int len1 = (int) s1.length(), len2 = (int) s2.length();if (len1 < len2 || (len1 == len2 && s1 < s2)) {//若整数s1 < s2,先打印负号,再交换swap(s1, s2);// 交换swap(len1, len2);cout << '-';}// 反向存储for (int i = 0; i < len1; i++) {a[i] = s1[len1 - i - 1] - '0';}for (int i = 0; i < len2; i++) {b[i] = s2[len2 - i - 1] - '0';}// 计算int len = max(len1, len2);for (int i = 0; i < len; i++) {if (a[i] < b[i]) {a[i + 1]--;a[i] += 10;}c[i] = a[i] - b[i];}// 删除前导0while (c[len] == 0 && len > 0) {len--;}//反向存储for (int i = len; i >= 0; i--) {str += to_string(c[i]);}cout << str;//输出return 0;
}

完结!

Tip:为了获得更深入的学习体验,请参考相关教程或书籍,了解C++语言的更多基本结构和基本语法。
在这里插入图片描述

每篇图片分享
图片来自inscode上的开源程序
濒危动物:巴西犰狳

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com