zoukankan      html  css  js  c++  java
  • 高精从入门到入土

    跑得超快的压位高精

    #include<bits/stdc++.h>
    using namespace std;  
    #define power 4//每次运算的位数为10的power次方,在这里定义为了方便程序实现  
    #define base 10000//10的power次方。//要压位的时候,只需改power 和 base即可,如压万位高精,那么power = 4, base = 10000  
    #define N 1001    //数组的长度。 
    #define rep(i,a,b) for(int i=a;i<=b;++i)
    #define dwn(i,a,b) for(int i=a;i>=b;--i) 
    char a[N], b[N];  
    struct num  
    {  
        int a[N];  
        num(){memset(a,0,sizeof(a));}
    	int& operator [](int x){return a[x];} 
        num(char *s)                                            //将一个字符串初始化为高精度数  
        {  
            memset(a,0,sizeof(a));  
            int len=strlen(s);  
            a[0]=(len+power-1)/power;//数的长度 
    		for(int i=0,t=0,w;i<len;w*=10,++i)
            {  
            	if(i%power==0){w=1,++t;}
    			a[t]+=w*(s[i]-'0');  
            }  
        }  
        void add(int k){if(k || a[0])a[++a[0]]=k;}     //在末尾添加一个数,除法的时候要用到  
        void re(){reverse(a+1, a+a[0]+1);}                   //把数反过来,除法的时候要用到  
        void print()                     
        {  
            printf("%d", a[a[0]]);        
            for(int i=a[0]-1;i>0;--i)  
            	printf("%0*d",power,a[i]);    //这里"%0*d", power的意思是,必须输出power位,不够则前面用0补足   
    		printf("
    ");    
    	}
    }p,q,ans;  
    
    
    bool operator < (num &p,num &q)//判断小于关系,除法的时候有用  
    {  
    	if(p[0]<q[0])return 1;
    	if(p[0]>p[0])return 0;
    	for(int i=p[0];i>0;--i)
    		if(p[i]!=q[i])
    			return p[i]<q[i];
        return false;  
    }  
    
    num operator +(num &p,num &q)
    {
    	num c;
    	c[0]=max(p[0],q[0]);
    	rep(i,1,c[0])
    	{
    		c[i]+=p[i]+q[i];
    		c[i+1]=c[i]/base;
    		c[i]%=base;
    	}
    	while(c[c[0]+1])++c[0];
    	return c;
    }
    
    num operator -(num &p,num &q)
    {
    	num c=p;
    	rep(i,1,c[0])
    	{
    		c[i]-=q[i];
    		if(c[i]<0)
    		{
    			c[i]+=base;
    			--c[i+1];
    		}
    	}
    	while(c[0] && !c[c[0]])--c[0];
    	return c;
    }
    
    num operator *(num &p,num &q)
    {
    	num c;
    	c[0]=p[0]+q[0]-1;
    	rep(i,1,p[0])
    		rep(j,1,q[0])
    		{
    			c[i+j-1]+=p[i]*q[j];
    			c[i+j]+=c[i+j-1]/base;
    			c[i+j-1]%=base;
    		}
    	if(c[c[0]+1])++c[0];
    	return c;
    }
    
    num operator /(num &p,num &q)               
    {  
        num x,y;
    	dwn(i,p[0],1)//从最高位开始取数  
        {  
            y.add(p[i]);             //把数添到末尾(最低位),这时候是高位在前,低位在后  
            y.re();                    //把数反过来,变为统一的存储方式:低位在前,高位在后  
            while(!(y<q))              //大于等于除数的时候,如果小于的话,其实答案上的该位就是初始的“0”  
                y=y-q,++x[i];        //看能减几个除数,减几次,答案上该位就加几次。  
            y.re();                    //将数反过来,为下一次添数做准备  
        }  
        x[0]=p[0];  
        while(x[0] && !x[x[0]])--x[0];  
        return x;  
    }  
    
    int main()  
    {  
    	freopen("A.txt","r",stdin);
        scanf("%s",a);  
        scanf("%s",b);  
        reverse(a,a+strlen(a));  
        reverse(b,b+strlen(b));  
    
    	p=num(a),q=num(b);
    	
    	ans=p+q;  
        ans.print();  
    
    	ans=p-q;
        ans.print();  
    
    	ans=p*q;
        ans.print();  
    
        ans=p/q;  
        ans.print();
    	return 0;  
    }  
    
  • 相关阅读:
    第三周学习进度总结
    第二周学习进度总结
    动手动脑04
    动手动脑03
    动手动脑02
    课堂实践总结
    课堂实践
    原码,反码和补码学习报告
    开学第一周
    第八周
  • 原文地址:https://www.cnblogs.com/sjsjsj-minus-Si/p/11634719.html
Copyright © 2011-2022 走看看