666 普及/提高− 足足300多行
查看原帖
666 普及/提高− 足足300多行
1254085
ZJ_lzz楼主2025/1/2 22:42

出的好,下次别出了

#include <cstdio>
#include <cstring>
using namespace std;
inline int max(int x,int y)
{
    if(x>y)
	{
		return x;	
	}
	else 
	{
		return y;
	}
}
struct bignum
{  //.引用的成员函数、构造函数、赋值写在结构体内,其余运算符重载写在结构体外
    int c[5010],l;
    void clear()
	{  //置0,函数内引用则置于最底层
        memset(c,0,sizeof(c));
        l=1;
    }
    bignum()
	{  //构造函数(置0)(最底层)
        clear();
    }
    bignum operator =(char *s)
	{  //字符串赋值,传进的串0位无意义,正文从1位开始(最底层)
        clear();
        int p=strlen(s+1);
        l=0;
        while(p>=4)
		{
            l++;
            c[l]=(s[p]-'0')+(s[p-1]-'0')*10+(s[p-2]-'0')*100+(s[p-3]-'0')*1000;
            p-=4;
        }
        if(p)
		{
		l++;	
		}
        for(int i=1;i<=p;i++)
		{
			c[l]=c[l]*10+s[i]-'0';
		}
        if(!l)
		{
			l=1;
		}
        return *this;
    }
    bignum operator =(int x)
	{  //小数字赋值
        char s[20];
        sprintf(s+1,"%d",x);
        *this=s;
        return *this;
    }
    bignum(char *s)
	{  //构造函数(字符串),传进的串正文应从1位开始
        *this=s;
    }
    bignum(int x)
	{  //构造函数(小数字)
        *this=x;
    }
    void read()
	{  //输入
        char s[10010];
        scanf("%s",s+1);
        *this=s;
    }
    void print()
	{  //输出
        printf("%d",c[l]);
        for(int i=l-1;i>=1;i--)
		{
            if(c[i]<10)
			{
				printf("000");
			}
            else if(c[i]<100)
			{
				printf("00");
			}
            else if(c[i]<1000)
			{
				printf("0");
		    }
            printf("%d",c[i]);
        }
    }
};
bool operator <(bignum &a,bignum &b)
{  //小于
    if(a.l!=b.l)
	{
		return a.l<b.l;
	}
    for(int i=a.l;i>=1;i--)
    {
    	if(a.c[i]!=b.c[i])
	    {
	    	return a.c[i]<b.c[i];
	    }
	}
    return 0;
}
bool operator >(bignum &a,bignum &b)
{  //大于
    return b<a;
}
bool operator ==(bignum &a,bignum &b)
{  //等于
    return (!(a<b))&&(!(b<a));
}
bool operator !=(bignum &a,bignum &b)
{  //不等于
    return (a<b)||(b<a);
}
bool operator <=(bignum &a,bignum &b)
{  //小于等于
    return !(b<a);
}
bool operator >=(bignum &a,bignum &b)
{  //大于等于
    return !(a<b);
}
bignum operator +(bignum &a,bignum &b)
{  //加
    bignum ans;
    ans=a;
    for(int i=1;i<=b.l;i++)
	{
		ans.c[i]+=b.c[i];
	}
    ans.l=max(a.l,b.l);
    for(int i=1;i<=ans.l;i++)
    {
    	if(ans.c[i]>=10000)
		{
            ans.c[i]-=10000;
            ans.c[i+1]++;
        }
	}
    if(ans.c[ans.l+1])
	{
		ans.l++;
	}
    return ans;
}
bignum operator -(bignum &a,bignum &b)
{  //减
    bignum ans;
    ans=a;
    for(int i=1;i<=b.l;i++)
	{
		ans.c[i]-=b.c[i];
	}
    for(int i=1;i<ans.l;i++)
    {
    	if(ans.c[i]<0)
		{
            ans.c[i]+=10000;
            ans.c[i+1]--;
        }
	}
    while(!ans.c[ans.l]&&ans.l>1)
	{
		ans.l--;
	}
    return ans;
}
bignum operator *(bignum &a,bignum &b)
{  //乘
    bignum ans;
    for(int i=1;i<=a.l;i++)
    {
    	for(int j=1;j<=b.l;j++)
		{
            ans.c[i+j-1]+=a.c[i]*b.c[j];
            ans.c[i+j]+=ans.c[i+j-1]/10000;
            ans.c[i+j-1]%=10000;
        }
	}
    if(ans.c[a.l+b.l])
	{
		ans.l=a.l+b.l;
	}
	else 
	{
		ans.l=a.l+b.l-1;
	}
    return ans;
}
bignum operator <<(bignum &x,int e)
{  //左移
    bignum ans;
    ans=x;
    for(int k=1;k<=e;k++)
	{
        for(int i=1;i<=ans.l;i++)
		{
			ans.c[i]<<=1;
		}
        for(int i=1;i<=ans.l;i++)
            if(ans.c[i]>=10000)
			{
                ans.c[i]-=10000;
                ans.c[i+1]++;
            }
        if(ans.c[ans.l+1])
		{
			ans.l++;
		}
    }
    return ans;
}
bignum operator >>(bignum &x,int e){  //右移
    bignum ans;
    ans=x;
    for(int k=1;k<=e;k++)
	{
        for(int i=ans.l;i>=1;i--)
		{
            if(ans.c[i]&1)
			{
				ans.c[i-1]+=10000;
			}
            ans.c[i]>>=1;
        }
        if(!ans.c[ans.l]&&ans.l>1)
		{
			ans.l--;
		}
    }
    return ans;
}
bignum operator /(bignum a,bignum b)
{  //除
    bignum e=1,ans;
    while(a>=b)
	{
        b=b<<1;
        e=e<<1;
    }
    while(e.l>1||e.c[1])
	{
        if(a>=b)
		{
            a=a-b;
            ans=ans+e;
        }
        b=b>>1;
        e=e>>1;
    }
    return ans;
}
bignum operator %(bignum a,bignum b)
{  //模
    bignum e=1,ans;
    while(a>=b
	){
        b=b<<1;
        e=e<<1;
    }
    while(e.l>1||e.c[1])
	{
        if(a>=b)
		{
            a=a-b;
            ans=ans+e;
        }
        b=b>>1;
        e=e>>1;
    }
    return a;
}
bignum a,b,c;
int main()
{
    a.read();
    b.read();
    c=a+b;
    c.print();
    printf("\n");
    if(a<b)
	{
        printf("-");
        c=b-a;
    }
	else 
	{
		c=a-b;
	}
    c.print();
    printf("\n");
    c=a*b;
    c.print();
    printf("\n");
    c=a/b;
    c.print();
    printf("\n");
    c=a%b;
    c.print();
    printf("\n");
    return 0;
}
2025/1/2 22:42
加载中...