C语言 加减乘除模 的 高精度计算 (超详细)

这篇具有很好参考价值的文章主要介绍了C语言 加减乘除模 的 高精度计算 (超详细)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

高精度加法

高精度乘法

高精度减法

         高精度除法

高精度模法


 文章来源地址https://www.toymoban.com/news/detail-423933.html

高精度计算是模拟算法的一种,通过字符串和整型数组的使用,将加减乘除的竖式运算模拟出来,达到计算的目的。其步骤大致分为:一,将字符串数据存到整型数组中,二,模拟算法,不同的算式对准不同的模拟代码,三,将保存的数据转移。

高精度加法

void addhigh(char a[],char b[],char res[])//a,b分别为两个加数的字符串,res返回答案
{
    int a_num[2005],b_num[2005];            //保存字符串a,b的数组
    for(int i=0;i<2005;i++)                 //初始化,保证开始每位上数字为0
        a_num[i]=0,b_num[2005]=0;

//因为在竖式运算中我们是从低位算起,所以我们倒序将a,b存到数组里
    for(int i=strlen(a)-1,j=0;i>=0;i--,j++) //倒序将a保存为数组,方便每一位的模拟
        a_num[j]=a[i]-'0';
    for(int i=strlen(b)-1,j=0;i>=0;i--,j++) //倒序将b保存为数组,方便每一位的模拟
        b_num[j]=b[i]-'0';
    int lenth_max = strlen(a)>strlen(b)?strlen(a):strlen(b); //计算长度,方便记录位数
    for(int i=0;i<lenth_max;i++) //加法运算的核心,其他(乘法减法)都是这里来实现
    {
        a_num[i]+=b_num[i];                 //a的每一位加上b的每一位;
        if(a_num[i]>=10)                    //因为是十进制,
            a_num[i+1]+=a_num[i]/10;        //下一位加上该为的10的除数,模拟进位
            a_num[i]=a_num[i]%10;           //大于十我们需要取10的模数,
    }//提示,如果是其他进制,只需要将10变为其他数
    if(a_num[lenth_max]!=0) //因为加法最多只能进一位
        lenth_max++;
    for(int i=lenth_max-1,j=0;i>=0;i--,j++)//将结果转移到字符串中
        res[j]=a_num[i]+'0';
    res[lenth_max]='\0';//将结果后打上终止符方便输出
}

观察代码发现实际上实现高精度加法的核心在于中间的一个for循环,其他全都是形同的预处理,所以我们可以想到高精度乘法的处理方式

高精度乘法

void multihigh(char a[],char b[],char res[])
{
	int lenth_a=strlen(a), lenth_b=strlen(b);
    int a_num[2005],b_num[2005],res_num[2005];

    for(int i=0;i<2005;i++)
        a_num[i]=b_num[i]=res_num[i]=0;


    for(int i=1;i<=lenth_a;i++) a_num[i]=a[lenth_a-i]-'0';
    for(int i=1;i<=lenth_b;i++) b_num[i]=b[lenth_b-i]-'0';
//-----------------------------------------------核心代码
    for(int i=1;i<=lenth_a;i++)//通过两重的循环实现每次数乘玩之后都要乘10
        for(int j=1;j<=lenth_b;j++)
            res_num[i+j-1]+=a_num[i]*b_num[j];//a,b的每一位相乘
            
    for(int i=1;i<lenth_a+lenth_b;i++)//十进制处理,大于10模除进位
        if(res_num[i]>=10){
            res_num[i+1]+=res_num[i]/10;
            res_num[i]%=10;
        }
    int lenth_max=lenth_a+lenth_b;//两数相乘后,结果的位数不会比两加数的位数之和大,方便后面找位数时降低循环次数
    
    while(res_num[lenth_max]==0&&lenth_max>1) lenth_max--;//从后找第一个非0的元素即为最高位数,从前找0不行;

//-------------------------------------------------核心代码
    for(int i=lenth_max,j=0;i>0;i--,j++) res[j]=res_num[i]+'0';
        res[lenth_max]='\0';
}

乘法和加法基本一样,但是高精度减法却又多了正负的判断。

高精度减法

首先写a字符串>b字符串的减法函数,这样如果a<b时只需将a,b位置颠倒;

void minHighlong(char a[],char b[],char res[])
{
    int a_num[2005],b_num[2005];
    int lenth_max=strlen(a);

    for(int i=0;i<2005;i++)
        a_num[i]=0,b_num[2005]=0;

    for(int i=strlen(a)-1,j=0;i>=0;i--,j++)
        a_num[j]=a[i]-'0';
    for(int i=strlen(b)-1,j=0;i>=0;i--,j++)
        b_num[j]=b[i]-'0';
//-----------------------------------------核心代码
    for(int i=0;i<strlen(a);i++)
    {
        a_num[i]-=b_num[i]; //a的数组减去b的数组
        if(a_num[i]<0)  a_num[i]+=10,a_num[i+1]--;
        //如果a的该位数小于0,将取前一位数的10来填补,同时前一位减去1
    }
//-----------------------------------------核心代码
    while(a_num[lenth_max]==0&&lenth_max>0) lenth_max--;
    for(int i=lenth_max,j=0;i>=0;i--,j++)
        res[j]=a_num[i]+'0';
    res[lenth_max+1]='\0';
}

接下来我们只需要写个函数实现判断a和b的大小关系,代码如下

int compare(char a[],char b[]) 
{
	if(strlen(a)<strlen(b))//比较长度,a<b的话返回0;
		return 0;
	if(strlen(a)>strlen (b))//同理
		return 1;
	else{
		for(int i=strlen(a);i>=0;i--)//长度相同逐位数去比较,由高向低比较数字大小
			 if(a[i]<b[i])
				return 0;
	}
	return 1;
}

不能用strcmp(),strcmp() 会根据 ASCII 编码依次比较 str1 和 str2 的每一个字符,直到出现不到的字符,或者到达字符串末尾(遇见\0)。不符合数学比大小。

最后将这两个函数组合起来就形成了最终函数

void minHigh(char a[],char b[],char res[])
{
    if(compare(a,b))//比较后确定ab的位置
        minHighlong(a,b,res);
    else{
        minHighlong(b,a,res);//将结果加工成负数
        res[strlen(res)+1]='\0';//加休止符确定末尾
        for(int i=strlen(res);i>0;i--) res[i]=res[i-1];//从末尾向后移动一位
        res[0]='-';//加上符号
    }   
}

高精度除法

高精除低精度我们可以模拟,但是高精除高精我们只能利用高精度减法一个一个减去,最后计算出结果,同时我们的结果也可能是高精度,所以在结果的处理上我们需要用高精度加法。

void dividHigh(char a[],char b[],char res[])
{
    res[0]='0';
    res[1]='\0';
    char one[2];
    one[0]='1';
    one[1]='\0';
    while(compare(a,b))//当a<b时说明不能除了,结束
    {
        addhigh(res,one,res);//结果增加
        minHigh(a,b,a);//减去一个除数
    }
}

高精度除法用的都是之前的加减函数来实现,这样效率特别低,所以判断条件时能用高精除低精时,尽量用高精除低精,其中高精除低精核心代码如下:

for(i=strlen(a)-1;i>=0;i--){ 
		reminder=reminder*10+a_num[i]; //模拟除法
		ans[i]=reminder/b;
		reminder%=b;
	}

高精度模法

高精度模低精度的话,我们只需读一位(得乘10)模一位就可以得到最终答案,

int mod(string a, int b) {
	
    int d = 0;

	for (int i = 0; i < a.size(); i++)     
    {
		d = (d * 10 + (a[i] - '0')) % b; 
	}
	
    return d;
}

每次模之后可以将数字不断的缩小到精度以内,但是高精度模高精度却不可以,所以我们在处理高精模高精度时,只需将除法改下就可以了,即利用高精循环去减,判断大小即可,这里就不赘述了

 

高精度运算就在于对每一位运算的模拟,处理好进位,拿一,相乘之后,就可实现整个运算。

 

到了这里,关于C语言 加减乘除模 的 高精度计算 (超详细)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 加减乘除简单吗?不,一点都不,利用位运算实现加减乘除(代码中不含+ - * /)

    这也是阿辉开的新专栏,知识将会很零散不成体系,不过绝对干货满满,今天这一篇 利用位运算实现加减乘除 费了阿辉九牛二虎之力,干的很自备饮水😆不多bb,进入今天的学习吧!!! 以下int均为有符号int,所求的加减乘除也是int类型的整型数 严谨 😏 在写加减乘除之前

    2024年02月03日
    浏览(44)
  • bigdecimal加减乘除运算

    打印的结果如下: 打印结果如下: 打印结果如下:

    2024年02月11日
    浏览(47)
  • 不用加减乘除做加法

    写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号,本题OJ链接 数据范围:两个数都满足 −10≤n≤1000 进阶:空间复杂度 O(1),时间复杂度 O(1) 分析 :本题要求不能使用+、-、*、/,所以我们应该从二进制的角度去考虑,因为二进制的加法可以通

    2024年02月10日
    浏览(40)
  • 图像四则运算(加减乘除)

    实验目的: 1.了解图像的算术运算在数字图像处理中的初步应用。 2.体会图像算术运算处理的过程和处理前后图像的变化。 3.能够实现简单的图像处理 实验原理: 图像的代数运算包括加,减,乘,除,这些运算的主要对象是图像数据块中的数据。这四种代数运算可以由如

    2024年02月08日
    浏览(52)
  • 只使用位运算实现加减乘除

    在线OJ: LeetCode 29. 两数相除 原题目的要求是不能使用乘法, 除法和取余运算符实现除法. 在本篇博客中把题目要求提高一点, 这里只使用位运算来实现, 顺便的也就把只使用位运算实现加减乘除实现了. 首先我们需要知道两数之和可以是两个数位相加和不进位相加之和, 而两数进

    2024年02月06日
    浏览(49)
  • Rust 复数运算,重载加减乘除运算

    复数定义 由实数部分和虚数部分所组成的数,形如a+bi 。 其中a、b为实数,i 为“虚数单位”,i² = -1,即虚数单位的平方等于-1。 a、b分别叫做复数a+bi的实部和虚部。 当b=0时,a+bi=a 为实数; 当b≠0时,a+bi 又称虚数; 当b≠0、a=0时,bi 称为纯虚数。 实数和虚数都是复

    2024年02月13日
    浏览(37)
  • Pytorch入门:Tensor加减乘除矩阵运算

    若张量维数大于2,则对最后两维进行matmul。进行此运算的要求是张量a与b除最后两维外的其他维必须一致:

    2024年02月12日
    浏览(46)
  • Python Opencv实践 - 图像的加减乘除

               

    2024年02月13日
    浏览(38)
  • Java进行数字计算 BigDecimal计算(加减乘除)

    Double只能处理16位有效数精度,在某些情况下精度对其需求是不够的,所以就有了BigDecimal。因为BigDecimal的精度范围的范围大,所以在问我们的开发业务中对精度要求高的属性,就需要BigDecimal来进行存储计算,防止精度丢失。这里我主要介绍一下BigDecimal的加,减,乘,除。四

    2023年04月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包