HDU 1002 A + B Problem II

关于大整数的模板学习

#include<iostream>
#include<vector>
#include<string>
using namespace std;
struct BigInteger{
	static const int BASE = 100000000;
	static const int WIDTH = 8;
	vector<int> s;
	
	BigInteger(long long num=0)//这个是构造函数,只要你输入初始化了,可以不要这个 
	{
		*this = num;
	}

	BigInteger operator = (long long num)//这个和下面一个的参数不一样,这个是整数型有一点大的可以直接用这个。但更大的数就只能用下面的字符串了。 
	{
		s.clear();
		do{
			s.push_back(num%BASE);
			num/=BASE;
			
		}while(num>0);
		return *this;
	}
	
	BigInteger operator = (const string& str){
		s.clear();
		int x,len=(str.length()-1)/WIDTH+1;//这个真的好巧妙。 
		for(int i=0;i<len;i++)//这个循环是,把一个长字符串,每8个字符存储在int的x中;substr是c++中的复制函数 
		{
			int end= str.length()-i*WIDTH;
			int start = max(0,end-WIDTH);
			sscanf(str.substr(start,end-start).c_str(),"%d",&x);//这个函数是从前往后; 
			s.push_back(x);
		}
		return *this;
	}
	
	BigInteger operator + (const BigInteger&b)const
	{
		BigInteger c;
		c.s.clear();
		for(int i=0,g=0;;i++)
		{
			if(g==0&&i>=s.size()&&i>=b.s.size())break;
			int x=g;
			if(i<s.size()) x+=s[i];
			if(i<b.s.size()) x+=b.s[i];
			c.s.push_back(x%BASE);//每两位相加,都要重新放入一个vector数组中。 
			g=x/BASE;
		}
		return c;
	}
	
};
istream& operator >> (istream &in, BigInteger &b){
    string x;
    in>>x;
    b=x;
    return in;
}

ostream& operator << (ostream &out,const BigInteger &b){
    int i;
    char buf[20];//vector是倒着存储的。 
    out<<b.s.back();//(最高位)不足8位的预防处理 //如果输出是6位,再执行下面的会多加上两个00;使答案错误。不行你试试! 
    for(i=b.s.size()-2;i>=0;i--){
        sprintf(buf,"%08d",b.s[i]);//不足8位补0//这个函数是从后往前; 
        //cout<<buf;
    }
    return out;
}

int main()
{
   int n;
   cin>>n;
   BigInteger a,b;
   int k=0;
   while(n--)
   {
   	  if(k++) cout<<endl;
   	  cin>>a>>b;
   	  cout<<"Case "<<k<<":"<<endl;
      cout<<a<<" + "<<b<<" = "<<a+b<<endl;
   }
   
   return 0;	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值