zoukankan      html  css  js  c++  java
  • C++中,用类和重载运算符写高精模板

    先放代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    struct bign
    {
    	int len,s[1000];
    	bign(){len=1;memset(s,0,sizeof(s));}//构造函数,用来初始化成员变量 
    	bign(int num){*this=num;}//拷贝构造函数,用来实现bign a=1234; 
    	bign(char *num){*this=num;}//拷贝构造函数,用来实现bign a="1234"; 
    	bign operator =(const char *num)//重载=运算符,实现a=1234,括号中是=后接的数,以下是高精赋值,返回要返回结果 
    	{
    		len=strlen(num);
    		for(int i=0;i<len;i++)s[i]=num[len-i-1]-'0';
    		return *this;//*this代表当前结构体 
    	}
    	bign operator =(const int num)//重载=运算符,实现a="1234" 
    	{
    		char a[1000];
    		sprintf(a,"%d",num);
    		*this=a;
    		return *this;
    	}
    	bign operator +(bign &a)//重载+运算符,以下是高精加代码 
    	{
    		bign c;
    		c.len=max(len,a.len)+1;//默认两数相加进位 
    		for(int i=0,x=0;i<c.len;i++)
    		{
    			c.s[i]=s[i]+a.s[i]+x;
    			x=c.s[i]/10;
    			c.s[i]%=10;
    		}
    		if(c.s[c.len-1]==0)c.len--;//如果没有进位,长度-1 
    		return c;
    	}
    	bign operator +=(bign &a)//重载+=运算符
    	{
    		*this=*this+a;
    		return *this;
    	}
    	bool operator <(bign &x)
    	{
    		if(len!=x.len)return len<x.len;//不能有前导0 
    		for(int i=len-1;i>=0;i--)
    		if(s[i]!=x.s[i])
    		return s[i]<x.s[i];
    		return false;//全部相等,<不成立 
    	}
    	bool operator >(bign &x){return x<*this;}//方便的是,只要重载< 运算符,其他关系运算符都可以表示出来 
    	bool operator <=(bign &x){return !(x<*this);}
    	bool operator >=(bign &x){return !(*this<x);}
    	bool operator ==(bign &x){return !(x<*this||*this<x);}
    	bool operator !=(bign &x){return x<*this||*this<x;}
    };
    ostream& operator <<(ostream &out,bign &x)//重载<<,实现cout<<a; 
    {
    	for(int i=x.len-1;i>=0;i--)cout<<x.s[i];
    	return out;
    }
    istream& operator >>(istream &in,bign &x)//重载>>,实现cin>>a; 
    {
    	char num[1000];
    	in>>num;
    	x=num;
    	return in;
    }
    int main()
    {
    	bign a,b,c;
    	cin>>a>>b;
    	c=a+b;
    	cout<<c<<endl;
    	return 0;
    }
    

      

    有人问
    各种const是干什么的?
    其实在这里,const的作用只是“增加程序可读性”,就是表示“这是一个不可改变的量”。
    还有人问

    	bign(int num){*this=num;}
    	bign(char *num){*this=num;}

    是用来干什么的?
    其实这个与bign a=123;bign a="1234";有关,就是在定义的时候赋值。
    为什么用=呢?C++编译器可以自动区别赋值和初始化(构造函数是初始化),对于算法,只要记住就可以了。

    本文相关知识:http://blog.csdn.net/c20190102/article/details/70738801

    本文作者:银河渡舟
    版权声明:本文采用 CC BY-NC-SA 3.0 CN协议进行许可
  • 相关阅读:
    actf_2019_babystack
    Exp9 Web安全基础
    Exp 8 Web基础
    Exp7 网络欺诈防范
    pwn堆总结
    基于OpenSSL的asn.1分析工具设计与实现 20175219罗乐琦 个人报告
    Exp6 MSF基础应用
    glibc free源码分析
    glibc malloc源码分析
    exp5 信息收集与漏洞扫描
  • 原文地址:https://www.cnblogs.com/widerg/p/6986375.html
Copyright © 2011-2022 走看看