zoukankan      html  css  js  c++  java
  • 高精度算法

    博客内容整理自从零开始学算法:高精度计算

    对于大数,我们会开一个数组来储存,数组的第一位储存这个数的位数,后面倒叙存储。

    高精度数的储存

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    
    using namespace std;
    const int MAXN=100;
    int a[MAXN+1];
    string s;
    
    int main()
    {
    	cin>>s;
    	memset(a,0,sizeof(a));
    	a[0]=s.length();
    	for(int i=1;i<=a[0];i++)
    	{
    		a[i]=s[a[0]-i]-'0';
    	}
    	return 0;
    }
    

    高精度数的比较

    int compare(int a[],int b[]) //a>b为1,a<b为-1,相等为0。
    {
    	if(a[0]>b[0]) return 1;
    	if(a[0]<b[0]) return -1;
    	for(int i=a[0];i>0;i--)
    	{
    		if(a[i]>b[i]) return 1;
    		if(a[i]<b[i]) return -1; 
    	} 
    	return 0;
    } 
    
    

    高精度加法

    void plush(int a[],int b[])
    {
    	int k;
    	if(a[0]>b[0]) k=a[0];
    	else k=b[0];
    	for(int i=1;i<=k;i++)
    	{
    		a[i+1]=a[i+1]+(a[i]+b[i])/10;
    		a[i]=(a[i]+b[i])%10;
    	}
    	if(a[k+1]>0) a[0]=k+1;
    	else a[0]=k;
    }
    

    模板题P1601 A+B Problem(高精)
    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #define MAXN 200
    
    using namespace std;
    string s1,s2;
    int a[MAXN+1],b[MAXN+1];
    
    void plush(int a[],int b[])
    {
    	int k;
    	if(a[0]>b[0]) k=a[0];
    	else k=b[0];
    	for(int i=1;i<=k;i++)
    	{
    		a[i+1]=a[i+1]+(a[i]+b[i])/10;
    		a[i]=(a[i]+b[i])%10;
    	}
    	if(a[k+1]>0) a[0]=k+1;
    	else a[0]=k;
    }
    
    int main()
    {
    	cin>>s1>>s2;
    	a[0]=s1.length();
    	b[0]=s2.length();
    	for(int i=1;i<=a[0];i++)
    	{
    		a[i]=s1[a[0]-i]-'0';
    	}
    	for(int i=1;i<=b[0];i++)
    	{
    		b[i]=s2[b[0]-i]-'0';
    	}
    	
    	plush(a,b);
    	for(int i=a[0];i>0;i--)
    	{
    		printf("%d",a[i]);
    	}
     } 
    
    

    高精度减法

    int gminus(int a[],int b[])
    {
    	int flag;
    	flag=compare(a,b);
    	if(flag==0)
    	{
    		memset(a,0,sizeof(a));
    		a[0]=1;
    		return 0;
    	}
    	if(flag==1)
    	{
    		for(int i=1;i<=a[0];i++)
    		{
    			if(a[i]<b[i]) 
    			{
    				a[i+1]--;
    				a[i]=a[i]+10;
    			}
    			a[i]=a[i]-b[i];
    		}
    		while(a[a[0]]==0) a[0]--;
    		return 0;
    	 } 
    	 if(flag==-1)
    	 {
    	 	for(int i=1;i<=b[0];i++)
    	 	{
    	 		if(b[i]<a[i]) 
    	 		{
    	 			b[i+1]--;
    				b[i]=b[i]+10; 
    			 } 
    			 a[i]=b[i]-a[i];
    		 }
    		 a[0]=b[0];
    		 while(a[a[0]]==0) a[0]--;
    		 return -1;
    	 }
    }
    
    

    模板题链接P2142 高精度减法
    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #define MAXN 1000010
    using namespace std;
    string s1,s2;
    int a[MAXN+1],b[MAXN+1];
    int compare(int a[],int b[])
    {
    	if(a[0]>b[0]) return 1;
    	if(a[0]<b[0]) return -1;
    	for(int i=a[0];i>0;i--)
    	{
    		if(a[i]>b[i]) return 1;
    		if(b[i]>a[i]) return -1;	
    	} 
    	return 0;
    } 
    
    int gminus(int a[],int b[])
    {
    	int flag;
    	flag=compare(a,b);
    	if(flag==0) 
    	{
    		memset(a,0,sizeof(a));
    		a[0]=1;
    		return 0; 
    	}
    	if(flag==1)
    	{
    		for(int i=1;i<=a[0];i++)
    		{
    			if(a[i]<b[i])
    			{
    				a[i+1]--;
    				a[i]=a[i]+10;
    			}
    			a[i]=a[i]-b[i];
    		}
    		while(a[a[0]]==0) a[0]--;
    		return 0;
    	}
    	if(flag==-1)
    	{
    		for(int i=1;i<=b[0];i++)
    		{
    			if(b[i]<a[i])
    			{
    				b[i+1]--;
    				b[i]=b[i]+10;
    			}
    			a[i]=b[i]-a[i];
    				
    		}
    		a[0]=b[0];
    		while(a[a[0]]==0) a[0]--;
    			return -1;
    	}
    }
    
    int main()
    {
    	cin>>s1>>s2;
    	a[0]=s1.length();
    	b[0]=s2.length();
    	for(int i=1;i<=a[0];i++)
    	{
    		a[i]=s1[a[0]-i]-'0';
    	}
    	for(int i=1;i<=b[0];i++)
    	{
    		b[i]=s2[b[0]-i]-'0';
    	}
    	int chos;
    	chos=gminus(a,b);
    	if(chos==0)
    	{
    		for(int i=a[0];i>0;i--)
    		{
    			printf("%d",a[i]); 
    		 } 
    	}
    	else if(chos==-1)
    	{
    		cout<<"-";
    		for(int i=a[0];i>0;i--)
    		{
    			
    			printf("%d",a[i]); 
    		 } 
    	}
    }
    

    高精度乘单精度数

    void multi(int a[],ll key)
    {
    	if(key==0)
    	{
    		memset(a,0,sizeof(a));
    		a[0]=1;
    		return 0;
    	}
    	for(int i=1;i<=a[0];i++)
    	{
    		a[i]=a[i]*key;
    	}
    	for(int i=1;i<=a[0];i++)
    	{
    		a[i+1]=a[i+1]+a[i]/10;
    		a[i]=a[i]%10;
    	}
    	k=a[0]+1;
    	while(a[k]>0)
    	{
    		a[k+1]=a[k+1]+a[k]/10;
    		a[k]=a[k]%10;
    		k++;
    		a[0]++;
    	}
    	return 0;
    }
    

    高精度乘高精度

    for(i = 0; i < ka; i++)
        for(j = 0; j < kb; j++)
        {
          c[i + j] = c[i + j] + a[i] * b[j];
          c[i + j +1] = c[i + j +1] + c[i + j]/10;
          c[i + j] = c[i + j] % 10;
        }
      if(!c[k])  k--;
    

    模板题链接:P1303 A*B Problem
    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #define MAXN 2010
    
    using namespace std;
    string s1,s2;
    int a[MAXN+1],b[MAXN+1],c[MAXN+1];
    
    int main()
    {
    	cin>>s1>>s2;
    	a[0]=s1.length();
    	b[0]=s2.length();
    	int k=a[0]+b[0]+1;
    
    	for(int i=1;i<=a[0];i++) a[i]=s1[a[0]-i]-'0';
    	for(int i=1;i<=b[0];i++) b[i]=s2[b[0]-i]-'0';
    	if(a[a[0]]==0||b[b[0]]==0) 
    	{
    		printf("0");
    		return 0;
    	}
    	for(int i=1;i<=a[0];i++)
    	{
    		for(int j=1;j<=b[0];j++)
    		{
    			c[i+j]=a[i]*b[j]+c[i+j];
    			c[i+j+1]=c[i+j+1]+c[i+j]/10;
    			c[i+j]=c[i+j]%10;			
    		}
    	}	
    //	printf("c[k]=%d",c[k-1]);
    	if(!c[k]) k--;
    	for(int i=k;i>1;i--)
    	{
    		printf("%d",c[i]);
    	}
    } 
    
    
    

    高精度除单精度

        ll d=0;
    	for(int i= a[0];i>0;i--)
    	{
    	    d=d *10 +a[i];
    	    c[i]=d/b;
    	    d=d%b;      
    	}   
    	while(c[a[0]]==0&&a[0]>1)  a[0]--; 
    

    模板题链接:P1480 A/B Problem
    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #define MAXN 2010
    #define ll long long
    
    using namespace std;
    string s1;
    ll b;
    int a[MAXN+1],c[MAXN+1];
    
    int main()
    {
    	cin>>s1>>b;
    	a[0]=s1.length();
    	for(int i=1;i<=a[0];i++) a[i]=s1[a[0]-i]-'0';
    	ll d=0;
    	for(int i= a[0];i>0;i--)
    	{
    	    d=d *10 +a[i];
    	    c[i]=d/b;
    	    d=d%b;      
    	}   
    	while(c[a[0]]==0&&a[0]>1)  a[0]--; 
    	for(int i=a[0];i>0;i--)
    	{
    		printf("%d",c[i]);
    	}
    } 
    
    
  • 相关阅读:
    12_springmvc拦截器
    11_springmvc之RESTful支持
    10_springmvc JSON数据交互
    09_springmvc图片上传
    09_springmvc异常处理
    08_springmvc数据回显和@ModelAttribute注解详解
    Eclipse-----解决调试源码不进入断点问题
    JavaScript-----截取字符串的常用方法
    排序(Sort)-----冒泡排序
    SpringMVC探究-----常用获取传递参数的方法
  • 原文地址:https://www.cnblogs.com/LITTLESUNwl/p/11008241.html
Copyright © 2011-2022 走看看