zoukankan      html  css  js  c++  java
  • 高精度模板

    从我洛谷博客里搬运的,算是补发一下

    1.高精度加法:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<algorithm>
    #include<string>
    #include<cstring>
    using namespace std;
    string x,y;
    int  a[5000000],b[5000000],c[500000],lena,lenb,lenc,jb;
    int main()
    {
    	cin>>x>>y;
    	lena=x.length() ;
    	lenb=y.length() ;
    	for(int i=1;i<=lena;++i)
    	{
    		a[i]=x[lena-i]-'0';
    	}
    	for(int i=1;i<=lenb;++i)
    	{
    		b[i]=y[lenb-i]-'0';
    	}
    	while(lenc<=lena||lenc<=lenb)
    	{
    		c[lenc]=a[lenc]+b[lenc]+jb;
    		jb=c[lenc]/10;
    		c[lenc]=c[lenc]%10;
    		lenc++;
    	}
    	c[lenc]=jb;
    	while(c[lenc]==0&&lenc!=1)
    	{
    		lenc--;
    	}
    	for(int i=lenc;i>=1;--i)
    	{
    		cout<<c[i];
    	}
    	return 0;
    }
    
    

    2.高精度减法

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<algorithm>
    #include<string>
    #include<cstring>
    using namespace std;
    string x,y;
    int bijiao(string xx,string yy)
    {
    	if(xx.length() < yy.length() )
    	{
    		return 1;
    	}
    	else if(xx.length() > yy.length() )
    	{
    		return 0;
    	}
    	else
    	{
    		for(int i=0;i<xx.length() ;++i)
    		{
    			if(xx[i]>yy[i])
    			{
    				return 0;
    			}
    			if(xx[i]<yy[i])
    			{
    				return 1;
    			}
    		}
    	}
    	return 0;
    }
    int  a[5000000],b[5000000],c[500000],lena,lenb,lenc=1,jb;
    int main()
    {
    	cin>>x>>y;
    	if(bijiao(x,y))
    	{
    		string g=x;
    		x=y;
    		y=g;
    		cout<<"-";
    	}
    	lena=x.length() ;
    	lenb=y.length() ;
    	for(int i=1;i<=lena;++i)
    	{
    		a[i]=x[lena-i]-'0';
    	}
    	for(int i=1;i<=lenb;++i)
    	{
    		b[i]=y[lenb-i]-'0';
    	}
    	while(lenc<=lena||lenc<=lenb)
    	{
    		if(a[lenc]<b[lenc])
    		{
    			a[lenc]+=10;
    			a[lenc+1]--;
    		}
    		c[lenc]=a[lenc]-b[lenc];
    		lenc++;
    	}
    	while(c[lenc]==0&&lenc!=1)
    	{
    		lenc--;
    	}
    	for(int i=lenc;i>=1;--i)
    	{
    		cout<<c[i];
    	}
    	return 0;
    }
    
    

    注意减数和被减数的大小关系O(∩_∩)O~

    3.高精度乘法:

    一边乘一边进行进位操作

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<algorithm>
    #include<string>
    #include<cstring>
    using namespace std;
    string s1,s2;
    int a[20000],b[20000],len1,len2,len3,c[20000]; 
    int main()
    {
    	cin>>s1>>s2;
    	len1=s1.length() ;
    	len2=s2.length() ;
    	for(int i=1;i<=len1;++i)
    	{
    		a[i]=s1[len1-i]-'0';
    	}
    	for(int i=1;i<=len2;++i)
    	{
    		b[i]=s2[len2-i]-'0';
    	}
    	int x;
    	for(int i=1;i<=len1;++i)
    	{
    		x=0;
    		for(int j=1;j<=len2;++j)
    		{
    			c[i+j-1]=a[i]*b[j]+c[i+j-1]+x;
    			x=c[i+j-1]/10;
    			c[i+j-1]%=10;
    		}
    		c[i+len2]=x;//进最前面的一位O(∩_∩)O哈哈哈~划重点  
    	}
    	len3=len1+len2;
    	while(c[len3]==0&&len3>1)
    	{
    		len3--;
    	}
    	for(int i=len3;i>=1;--i)
    	{
    		cout<<c[i];
    	}
    	return 0;
    }
    
    

    例子:求10000以内n的阶乘。

    下例子中用到的高精乘法是先全乘起来吗,然后在进行处理进位等

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<cstring>
    #include<string>
    using namespace std;
    int a[1000000],n;
    int main()
    {
    	cin>>n;
    	int len=1;
    	a[1]=1;
    	int x;
    	for(int i=2;i<=n;++i)
    	{
    		for(int j=1;j<=len;++j)
    		{
    			a[j]=a[j]*i; 
    		}
    		for(int k=1;k<=len;++k)
    		{
    			if(a[k]>9)
    			{	
    				a[k+1]+=a[k]/10;
    				a[k]=a[k]%10;
    				if(k==len)	len++;//最高位进位
    			}					
    		}	
    	}
    	for(int i=len;i>=1;--i)
    	{
    		cout<<a[i];
    	}
    	return 0;
    }
    
    

    4.高精度除法:

    (1)高精除单精

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<algorithm>
    #include<string>
    #include<cstring>
    using namespace std;
    string s1,s2;
    int a[20000],b[20000],len1,len2,len3,c[20000];
    int main() {
    	cin>>s1;
    	int g;
    	cin>>g;
    	len1=s1.length() ;
    	for(int i=0; i<len1; ++i) {
    		a[i+1]=s1[i]-'0';
    	}
    	int x=0;
    	for(int i=1;i<=len1;++i)
    	{
    		c[i]=(x*10+a[i])/g;
    		x=(x*10+a[i])%g;
    	}
    	len3=1;
    	while(c[len3]==0&&len3<len1)
    	{
    		len3++;
    	}
    	for(int i=len3;i<=len1;++i)
    	{
    		cout<<c[i];
    	}	
    	return 0;
    }
    
    

    高精度总结:

    1.注意最高位的处理。

    2.注意删除前导0

    重载运算符实现高精

    点这里

  • 相关阅读:
    git pull 的时候 把本地的修改 覆盖远程端
    git 把其他分支上的文件拿来覆盖本地
    JS高德地图计算两地之间的实际距离
    C# 微信开发-----微信会员卡(三)激活会员卡
    C# 微信开发-----微信会员卡(二)
    Jquery点击div之外的地方隐藏当前div
    css好看的银行卡号样式
    C# 微信开发-----微信会员卡(一)
    Js操作Array数组
    好看的404代码
  • 原文地址:https://www.cnblogs.com/pyyyyyy/p/10960492.html
Copyright © 2011-2022 走看看