• 【算法学习笔记】04.C++中结构体定义练习(bign初步)


    练习基本上是照着源码打的,,主要是各种const想不清楚原因和来由。

    以下是自己的代码,已存为bign.h



    #include <stdio.h>
    #include <iostream>
    #include <string> //此处不用.h 
    using namespace std;//使用命名空间std 
    struct bign//C++中取消了tpyedef 
    {
    	//this 关键字表示的意思是 &x 所以用*this才能操作 不过为什么不能*this.len呢? 
    	int len,s[3000];// 定义成员变量 
    	//定义构造函数 C++专属 
    	bign()
    	{
    		len=1;
    		memset(s,0,sizeof(s));
    	}
    	//定义对于数组的=运算法则 
    	bign operator = (const char* num)//此处的const何用? 
    	{
    		len = strlen(num);
    		for(int i=0;i<len;i++)
    			s[i]=num[len-1-i]-'0'; 
    		//s[len-1-i]=num[i]-'0';
    		return *this;
    	}
    	//定义对于int变量的=运算法则 
    	bign operator = (const int num)
    	{
    		char t[3000];
    		sprintf(t,"%d",num);
    		*this=t;//此处已经运用了对于数组的赋值运算法则 len,s已经在内部实现 
    		return  *this;
    	}
    	//定义初始化方法
    	bign(int num) {*this = num;}
    	bign(const char* num) {*this = num;}//此处要求必须为常量数组
    	// 定义成员函数
       	string str()const//此处的const表示不会在x.str()函数内部改变x的值 
     	{
     		string res="";//为string变量初始化
    		for(int i=0;i<len;i++) 
    			res = (char)(s[i]+'0')+res;//res累加顺序
    		if(res=="") res="0";
    		return res;
     	} 
     	
     	//定义加法
     	bign operator + (const bign& b) const //返回一个bign的运算结果 
     	{
     		bign res;
    		res.len=0;
    		for(int i=0,g=0;g||i<max(len,b.len);i++)
    		{
    			int x = g; //从上一次运算中取出累加余量
    			if(i<len) 
    				x += s[i];
    			if(i<b.len) 
    				x += b.s[i];
    			res.s[res.len++]=x%10;
    			g=x/10;
    		}
    		return res;
    	}
    	
    	//定义乘法 
     	bign operator * (const bign& b) const //返回一个bign的运算结果 
     	{ 
     		bign res;
    		res.len=0;
    		for(int i=0;i<b.len;i++)
    		{
    			int g=0;
    			bign tem; 
    			tem.len=0;
    			for(int k=0;k<i;k++)
    			{
    				//tem.s[tem.len++]=0;
    				tem.len++;
    			}
    			for(int j=0;j<len;j++) 
    			{
    				int x = g + s[j]*b.s[i]; //从上一次运算中取出累乘余量 
    				tem.s[tem.len++]=x%10;
    				g=x/10;
    			} 
    			res = res + tem; 
    		}
    		return res;
    	}
    	 
     	//定义比较符号
    	bool operator < (const bign &b )const
    	{
    
    		if(len!=b.len)
    			return len<b.len; 		 
    		else
    		{
    			for(int i=len-1;i>0;i--)
    			{
    				if(s[i]!=b.s[i])
    					return s[i]<b.s[i];
    			}
    		} 
    	}
    	
    	bool operator > (const bign& b)const 
    	{ return b<*this;}
    	bool operator >= (const bign& b)const 
    	{ return !(b>*this);}
    	bool operator <= (const bign& b)const 
    	{ return !(*this>b);}
    	bool operator != (const bign& b)const
    	{ return (*this<b||*this>b);} 
    	bool operator == (const bign& b)const
    	{ return !(*this != b);}
    	  
    } ;//";" 太重要了 
    
    
    //为bign定义<<和>>运算符 必须在外部
    
    istream& operator >>(istream &in,bign& x)//&的位置有关系么?
    {
    	string s;
    	in>>s;//in表示输入的流 
    	x=s.c_str();//把string 转换为char*
    	return in; 
    	
    } 
    
    ostream& operator <<(ostream &out,const bign& x)//此处要求x为const的
    {
    	out<<x.str();
    	return out;
    } 
    

    提出了几个疑问,

    1.为什么不能*this.len

    2.bign operator = (const char* num)//此处的const何用? 

    3.istream& operator >>(istream &in,bign& x)//&的位置有关系么?



  • 相关阅读:
    socket:套接字
    hashlib 加密
    面向对象总结
    类的内置方法
    反射
    类中的三个装饰器方法
    text
    模块
    练习1
    内置函数
  • 原文地址:https://www.cnblogs.com/yuchenlin/p/4379270.html
Copyright © 2020-2023  润新知