算法之高精度(含实例与详解)C语言

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

一、什么是高精度

       高精度本质上是一种计算,由于int型和long long型的存储的数据大小有限。在有符号定义的情况下,int型为2的31次方减1;在无符号定义的情况下,lint型为2的32次方。因此过于巨大的数无法展示,这就用到了高精度来计算,其原理为将很大的数一位一位存在数组中,最后输出数组。

 

 

 

二、高精度加法

        说起来也觉得有些可笑,但确实如此,高精度加法我们运用的是小学的数列式来理解。

                   c语言高精度,数据结构与算法,算法,c语言,蓝桥杯c语言高精度,数据结构与算法,算法,c语言,蓝桥杯

         如左图所示,我们首先将1加7得8,6加7为13,1加6为7;然后发现13大于10,因此要进1。所以,7需要加1变为8。写成代码如上右图所示,给大家解释一下吧,aar1数组表示1,6,7三位数;arr2数组表示6,7,1三位数,值得注意的一点是在数组中应倒置这样的话便于计算;arr3数组表示的是最后的结果。第一行代码是将1加7相加得到的结果(一会儿再解释为啥还要加arr3),第二行代码是将大于10的部分交于数组的下一个变量(体现在数学中也就是进位);第三行代码是得出结果(如6加7得13,经过此步后便得到3)。由于这只是得到某一位的结果,因此循环才能得到最终的结果,上面未解释的arr3则是为了防止可能由于前一位进1而导致本身不再是0。给大家上代码理解一下吧。

# include <stdio.h>
# include <string.h>
int main ()
{
	int max(int x,int y);


    //利用字符串形式输入,否则数字太大,整形放不下。
	char ch1[505]="123",ch2[505]="123";
	int arr1[505]={0},arr2[505]={0},arr3[505]={0};
	scanf("%s",&ch1);scanf("%s",&ch2);
	int sz1=strlen(ch1);int sz2=strlen(ch2);



    //因为要循环相加,sz3求循环条件的,由于最后一位相可能大于10,因此先进1
    int sz3=max(sz1,sz2)+1;




    //将字符串转变为数组形式存储
	for(int i=0;i<sz1;i++)
	{
		arr1[sz1-i]=ch1[i]-'0';
	}
	for(int i=0;i<sz2;i++)
	{
		arr2[sz2-i]=ch2[i]-'0';
	}



    //高精度加法主体
	for(int i=1;i<=sz3;i++)
	{
		arr3[i]=arr3[i]+arr1[i]+arr2[i];
		arr3[i+1]=arr3[i]/10;
		arr3[i]=arr3[i]%10;
	}


    //判断数组最后一位是否为0,不是的话减去0,并且sz3还应大于0,否则可能什么结果也不输出(当输入为0时)
	if(arr3[sz3]==0&&sz3>0)   sz3--;


    输出
	for(int i=sz3;i>0;i--)
	{
		printf("%d",arr3[i]);
	}
	return 0;
}
int max(int x,int y)
{
	int f;
	if(x>y)  f=x;
	else    f=y;
	return f;
}

 

 

 

三、高精度减法

            高精度减法其实和加法差不多,不过需要注意的一点是应先判断大小,应该用大的减小的,计算机不会算小的减大的,下图是高精度减法主体。

c语言高精度,数据结构与算法,算法,c语言,蓝桥杯

            高精度减法也是循环相减的,一位一位减。给大家解释一下高精度减法主体的代码吧,先判断一下减数和被减数的大小关系,如果减数大于被减数,需要进一,也就是上一位的减数减一,而这一位加10,这就是第二三行代码的意思,最后一行则是相减得到的数,给大家上整体的代码看看吧。

# include <stdio.h>
# include <string.h>
int main ()
{
	int compare(char a1[10090],char a2[10090],int sz1,int sz2);
	char a1[10090]="123",a2[10090]="123";
	int b1[10090]={0},b2[10090]={0},b3[10090]={0};
	scanf("%s",&a1);scanf("%s",&a2);
	int sz1=strlen(a1);
	int sz2=strlen(a2);


 
    //比较大小
	int m=compare(a1,a2,sz1,sz2);


    //判断是否改变两个的位置
	if(m==0)
	{
		char q[10090]="123";
		strcpy(q,a1);
		strcpy(a1,a2);
		strcpy(a2,q);
	}
	int sz3=strlen(a1);
	int sz4=strlen(a2);



    //将字符串变为数组形式
	for(int i=0;i<sz3;i++)
	{
		b1[sz3-i]=a1[i]-'0';
	}
	for(int i=0;i<sz4;i++)
	{
		b2[sz4-i]=a2[i]-'0';
	}


    //高精度减法主体
	for(int i=1;i<=sz3;i++)
	{
		if(b1[i]<b2[i])
		{
			b1[i+1]--;
			b1[i]=b1[i]+10;
		}
		b3[i]=b1[i]-b2[i];
	} 



    //判断是否为0
	while(b3[sz3]==0&&sz3>1)    sz3--;

    
    //判断是否要变为负数
	if(m==0)   printf("-");

    //输出0
	for(int i=sz3;i>0;i--)
	{
		printf("%d",b3[i]);
	}
	return 0;
}
 
 
 
 
int compare(char a1[10090],char a2[10090],int sz1,int sz2)
{
	if(sz1>sz2)    return 1;
	else if(sz1<sz2)   return 0;
	else 
	{
		for(int i=0;i<sz1;i++)
		{
			if(a1[i]>a2[i])   return 1;
			else if(a1[i]<a2[i])    return 0;
			else   continue;
  		}
	}
}

 

 

 

四、高精度乘法

 高精度乘法的本质也是利用小学数学的列式来解决问题    c语言高精度,数据结构与算法,算法,c语言,蓝桥杯      c语言高精度,数据结构与算法,算法,c语言,蓝桥杯             

 给大家解释一下代码吧,大家经过高精度加法和高精度减法的代码应该也是对高精度了解的比较清楚了,给大家简单介绍一下高精度乘法吧,如上左图所示,假设a为一个数组b为一个数组,c为一个数组,通过上图可以看出,乘法每一个相乘的结果的下标,为上面两个的下标之和减1;如c3中的2是a2和b2中2和2相加减1得,c4中的4是由a4和b1或者b4和c1中4和1相加减1得到的。这就是来源。下面则是我们来实现这个代码,相同的是,这也是一个循环(嵌套循环,大家可以看代码),我只是把主体写出。

# include <stdio.h>
# include <string.h>
int main ()
{
	//定义变量 
	char a1[2005]="123";
	char a2[2005]="123";
	int b1[2005]={0},b2[2005]={0},b3[2005]={0};
	scanf("%s",a1);scanf("%s",a2);
	int sz1=strlen(a1);int sz2=strlen(a2);
	
	
	//将字符串变为数组 
	for(int i=0;i<sz1;i++)
	{
		b1[sz1-i]=a1[i]-'0';
	}
	for(int i=0;i<sz2;i++)
	{
		b2[sz2-i]=a2[i]-'0';
	}
	
	//循环条件 
	int sz3=sz1+sz2;
	 
	 
	 
	//循环主体
	for(int i=1;i<=sz1;i++)
	{
		for(int j=1;j<=sz2;j++)
		{
			b3[i+j-1]=b3[i+j-1]+b1[i]*b2[j];
			b3[i+j]=b3[i+j]+b3[i+j-1]/10;
			b3[i+j-1]=b3[i+j-1]%10;
		}
	}  



	if(b3[sz3]==0&&sz3>0)   sz3--;


    //输出
	for(int i=sz3;i>0;i--)
	{
		printf("%d",b3[i]);
	}
	return 0;
}

 

 

 

   五、实例(求函数阶乘和)

·c语言高精度,数据结构与算法,算法,c语言,蓝桥杯

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

 这里我用了洛谷的一道题来举例,结合了高精度加法和高精度减法,还是比较有难度的。即使我们可以掌握高精度这个知识点,但能AC这道题还是不容易的。先给大家上代码再解释吧。

 

# include <stdio.h>
int main ()
{
	int n,cnt=1;scanf("%d",&n);
	int a[10000]={0},b[10000]={0};
	for(int i=0;i<10000;i++)   a[i]=0;
	for(int i=0;i<10000;i++)   b[i]=0;
	a[1]=1;



    
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=cnt;j++)
		{
			a[j]*=i;
		}
		for(int q=1;q<=cnt;q++)
		{
			if(a[q]<10)   continue;
			int x=q;
			while(x<=cnt)
			{
				if(a[cnt]>9)   cnt++;
				a[x+1]=a[x+1]+a[x]/10;
				a[x]=a[x]%10;
				x++;
			}
		}



		for(int h=1;h<=cnt;h++)
		{
			b[h]=a[h]+b[h];
			if(b[cnt]>10) cnt++;
			b[h+1]=b[h+1]+b[h]/10;
			b[h]=b[h]%10;
		}

	}



	for(int i=cnt;i>0;i--)
	{
		printf("%d",b[i]);
	}
}

怎么说呢,这个解释起来还是比较麻烦的,我们先输入n,然后就进入循环主体了,先for循环吧,将每一位数字都乘以i;然后再进入另一个循环,先判断每一位数是否大于9,如果大,肯定要进1,因此要进入另一个循环。然后就是进入一个while循环,判断最后一位是否大于9,如果大于,那么肯定要进,为防止溢出,我们就需要将数组加1,然后就是进入高精度乘法主体,然后再进入高精度加法主体,最后循环完输出即可。

写的不好,如果我有什么理解,一定会及时更改,谢谢各位的观看。

 

 

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

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

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

相关文章

  • 高精度算法笔记·····························

    加法 减法 乘法 除法 高精度加法的步骤: 1.高精度数字利用字符串读入 2.把字符串 翻转 存入两个整型数组A、B 3.从低位到高位,逐位求和,进位,存余 4.把数组C从高位到低位依次输出         1.2为准备         3为加法具体实现(0按位取反为-1,即-1时结束等价于=0)  

    2024年01月21日
    浏览(37)
  • C++高精度算法

    目录 前言:  思路: 高精度加法: 高精度减法: 高精度乘法: 高精度除法:  代码: 一、高精度加法 二、高精度减法  三、高精度乘法  四、高精度除法 最后         计算机最初、也是最重要的应用就是数值运算。在编程进行数值运算时,有时会遇到运算的精度要求特

    2024年02月14日
    浏览(29)
  • 【算法】模拟,高精度

      P1601 A+B Problem(高精) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路就是模拟,值得注意的就是要用字符串类型输入。存进自己的int数组时要倒着存,因为如果是正着存的话,进位会有点trouble。 时间复杂度O(max(m,n))    P1303 A*B Problem - 洛谷 | 计算机科学教育新生态 (lu

    2024年02月09日
    浏览(35)
  • 高精度减法(C语言实现)

    众所周知,整数在C和C++中以 int , long , long long 三种不同大小的数据存储,数据大小最大可达 2^64 ,但是在实际使用中,我们仍不可避免的会遇到爆 long long 的超大数运算,这个时候,就需要我们使用高精度算法,来实现巨大数的运算。 高精度的本质是将数字以字符串的形

    2024年02月05日
    浏览(30)
  • C++基础算法高精度篇

    📟作者主页:慢热的陕西人 🌴专栏链接:C++算法 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 主要讲解了高精度算法的四种常用的计算 以下数字均指位数 ①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

    2024年02月16日
    浏览(26)
  • C++ 算法 高精度(较详细.)

            在我们进行计算的过程中,经常会遇到 几十位,甚至几百位的数字 的计算问题,也有可能会遇到小数点后几十位,几百位的情况,而我们面对这样的情况下,   和 的数据范围显然是 不够使用 的了。因此这时,我们就需要引入一个新的算法,叫做 高精度算法

    2023年04月10日
    浏览(25)
  • 高精度加法,减法,乘法,除法(下)(C语言)

    前言 上一篇博客我们分享了高精度加法,减法,这一期我将为大家讲解高精度乘法和高精度除法。那让我们开始吧! 对加法和减法感兴趣的话就点我 让我们想想我们平时做数学时遇见乘法是怎么做的。以下图为例。 高精度乘法也是这样的一个思路,首先我们先把a和b的值储存

    2024年02月04日
    浏览(50)
  • 高精度加法,减法,乘法,除法(上)(C语言)

    前言 本篇内容介绍加法和减法,如果想看乘法和除法就点这里-高精度乘法,除法 加,减,乘,除这些运算我们自然信手捏来,就拿加法来说,我们要用c语言编程算a+b的和,只需让sum = a+b即可,可是这是局限的,我们都知道int的表示的最大值为2147483647(32位和64位机器)。但

    2024年02月03日
    浏览(28)
  • 基于matlab的高精度信号峰值检测算法

    目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB        峰值检验是示波表中数据采集方式之一, 这种技术起源于存储深度不能满足捕获毛刺的需要。如果用模拟示波器去观察, 只有当毛刺信号是重复性的并且和主信号同步时, 才能看到毛刺信号 。由于毛刺源于其

    2024年02月12日
    浏览(29)
  • C++基础算法①——高精度加减法计算

    当我们利用计算机进行数值计算,有时候会遇到这样的问题: n!的精确结果是多少? 当n小于30的时候,我们当然可以通过电脑自带的计算器计算出来。但是当我们遇到 100! 的时候就没有办法直接计算出精确的结果。再比如,求两个20000位的数的和。 那怎么解决精度缺失的问

    2024年02月16日
    浏览(30)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包