高精度 加 减 乘

2024-08-23 21:48
文章标签 高精度

本文主要是介绍高精度 加 减 乘,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Add

#include<stdio.h>
#include<math.h>
#include<memory.h>
#include<iostream>
using namespace std;
#define M 100
void add(char* s1, char* s2, char* res) 
{//需要两个字符串参数&&无返回值int num1[M], num2[M];int i, j, len1, len2,n,t;memset(num1, 0, M*sizeof(int));memset(num2, 0, M*sizeof(int));//char转换成intlen1 = strlen(s1);len2 = strlen(s2);for (i = len1 - 1, j = 0; i >= 0; i--) {num1[j++] = s1[i] - '0';}for (i = len2 - 1, j = 0; i >= 0; i--) {num2[j++] = s2[i] - '0';}//加法运算for (i = 0; i < M; i++) {num1[i] += num2[i];if (num1[i] > 9) {num1[i] -= 10;num1[i + 1]++;}}//找到第一个不是0的数for (i = M - 1; i >= 0 && num1[i] == 0; i--) {;}num1[i + 1] = -1;//判断结果为0的情况n = i + 1;if (n == 0) {num1[0] = 0;num1[1] = -1;}else {//倒置for (i = 0; i < n / 2; i++) {int temp = num1[i];num1[i] = num1[n - i - 1];num1[n - i - 1] = temp;}}//int转换成charfor (i = 0; num1[i] != -1; i++) {res[i] = num1[i] + '0';}res[i] = 0;
}int main() {char s1[M], s2[M], res[M];cin >> s1 >> s2;Add(s1, s2, res);cout << res << endl;return 0;
}

自己写的有点复杂,以下会更有效的

/** 高精度加法* 输入a,b* 结果储存在a中
*/
void add(char *a, char *b)
{int i, j, inc = 0, s, k;int len1 = strlen(a);//cal the length of a,bint len2 = strlen(b);strrev(a);//reverse string a,b    strrev(b);k = 0;while (i < len1&&j < len2) {s = (a[i] & 0xf) + (b[i] & 0xf) + inc;a[k++] = (s % 10) + '0';//add b to ainc = s / 10;//store the carry i++; j++;}//length of a is greater than b    while (i < len1) {s = (a[i] & 0xf) + inc;a[k++] = (s % 10) + '0';inc = s / 10;i++;}//length of b is greater than a  while (j < len2) {s = (b[j] & 0xf) + inc;a[k++] = (s % 10) + '0';inc = s / 10;j++;}//at last,if the carry is not 0,store it into a if (inc) {a[k++] = inc + '0';}a[k] = 0;strrev(a);
}

Sub

仿照加法写个减法

//高精度数减法 
void sub(char* s1, char* s2, char* ans)
{   //s1>s2int i = 0, j = 0, len1, len2, s;len1 = strlen(s1);len2 = strlen(s2);strrev(s1);strrev(s2);while (j < len2) {s = s1[i] - s2[j];if (s < 0) {s = s + 10;s1[i + 1]--;}ans[i] = s + '0';i++; j++;}while (i < len1) {ans[i] = s1[i];i++;}while (ans[i-1] == '0') {i--;}ans[i] = 0;strrev(ans);
}

multiple

//高精度乘法
void multiple(char* a, char* b, char* res)
{int i, j, len1, len2,inc;len1 = strlen(a);len2 = strlen(b);int x[2*N];memset(x, 0, 2*N);//一定要初始化strrev(a);strrev(b);//对应位相乘for (i = 0; i < len1; i++) {for (j = 0; j < len2; j++) {x[i + j] += (a[i] & 0xf) * (b[j] & 0xf);}}//进位运算&int转换成charfor (i = 0, inc = 0; i <= len1 + len2 - 2; i++) {x[i] += inc;res[i] = (x[i] % 10) + '0';inc = x[i] / 10;}if (inc) {res[i++] = inc + '0';}res[i] = 0;strrev(res);
}

这篇关于高精度 加 减 乘的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1100588

相关文章

高精度计算(代码加解析,洛谷p1601,p1303)除法待更新

目录 高精度加法 高精度减法 高精度乘法 高精度加法 我们知道在c++语言中任何数据类型都有一定的表示范围。当两个被加数很大时,正常加法不能得到精确解。在小学,我们做加法都采用竖式方法。那么我们也只需要按照加法进位的方式就能得到最终解。 8 5 6+ 2 5 5-------1 1 1 1 加法进位: c[i] = a[i] + b[i];if(c[i] >=

高精度打表-Factoring Large Numbers

求斐波那契数,不打表的话会超时,打表的话普通的高精度开不出来那么大的数组,不如一个int存8位,特殊处理一下,具体看代码 #include<stdio.h>#include<string.h>#define MAX_SIZE 5005#define LEN 150#define to 100000000/*一个int存8位*/int num[MAX_SIZE][LEN];void

高精度计算----减法运算(浮点型)

基于上一贴,修改减法运算适合于高精度浮点型计算。 因为减法比加法难度大一点,考虑的地方也要多一些,可能代码有欠缺,欢迎指出。 运算说明: 1、相减函数依旧没改变,包括上一贴的判断被减数与减数的大小函数也没变。 2、增加两个函数,取小数位数函数和结果处理(回归小数点)函数 3、与加法浮点高精度运算相比,这里改变较多的是结果处理函数,加法加完后,位数不减反增,而且最多增一位。减法会消失掉好多

高精度计算----减法运算

处理大数减法运算: 1、首先要判断被减数与减数哪个更大,再相应的带入减法函数去处理。具体的比较可以使用字符串的相关知识去比较。 2、相减要先对齐数组,依照减数的长度,执行相应的减法运算次数。 3、不需要借位相减的话,直接减去;需要的话,向前借一位,若前一位是0,则再前借(此时前一位的0变为10)。 测试程序效果如下:   以下代码包括相减函数,比较被减数减数函数,若有错误,请指出:

高精度加法,乘法,阶乘

#include <iostream>#include <map>#include <string>#include <algorithm>using namespace std;const int Max = 50000;string str1,str2;/***********乘法***********/void chenfa(){cin >> str1>>str2;int a

高精度治具加工的重要性和创新性

在现代制造业中,高精度治具加工扮演着至关重要的角色。它不仅是生产过程中的关键环节,更是推动行业不断创新和发展的重要力量。时利和将解析高精度治具加工的重要性和创新性。   一、高精度治具加工的重要性   1.确保产品质量   高精度治具能够为生产过程提供准确的定位、夹紧和导向功能,从而确保产品的尺寸精度、形状精度和表面质量。例如,在电子制造领域,高精度的治具可以保证芯片的精确安装,提高电子

【HDU】4927 Series 1 高精度

传送门:【HDU】4927 Series 1 题目分析:公式很好推,到最后就是C(n-1,0)*a[n]-C(n-1,1)*a[n-1]+C(n-1,2)*a[n-2]+...+C(n-1,n-1)*a[n]。 用C(n,k)=C(n,k-1)*(n-k+1)/k即可快速得到一行的二项式系数。 我看JAVA不到1000B 15分钟就能过。。。我又敲了大数模板然后将近2个小时才过T U

高精度加、减、乘、除(高精除以低精)

高精度加法 法1:P1601 A+B Problem(高精) #include <bits/stdc++.h>using namespace std;char s1[510], s2[510];int a[510], b[510], sum[510];int lena, lenb, lens;int main(){cin >> s1 >> s2;lena=strlen(s1);le

【高精度】-DLUTOJ-1176-大数乘法

题目链接:http://acm.dlut.edu.cn/problem.php?id=1176 题目描述:赤裸的大数乘法 解题思路: 突然想到自己没写过高精度乘法,就回咱们自己OJ上找出了这道题,赤裸的高精度乘法而已,没想到依然觉得不好写,准确说来是我从小到大算乘法的习惯使我产生了错觉:“ 想写大数乘法就得先写一个大数加法出来 ”。喂!我短路了半天才想明白,int 数组里可以存个两位数啊,再

人脸静态活体检测(高精度版) API 对接说明

人脸静态活体检测(高精度版) API 对接说明 本文将介绍人脸静态活体检测(高精度版)API 对接说明,它可用于对用户上传的静态图片进行防翻拍活体检测,以判断是否是翻拍图片。 接下来介绍下 人脸静态活体检测(高精度版) API 的对接说明。 申请流程 要使用 API,需要先到 人脸静态活体检测(高精度版) API 对应页面申请对应的服务,进入页面之后,点击「Acquire」按钮,如图所示: