社区讨论

手写string爆空间了

P1601高精度加法参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lpl7d2tj
此快照首次捕获于
2023/11/30 20:59
2 年前
此快照最后确认于
2023/12/01 09:11
2 年前
查看原帖
CPP
#include<iostream>
#include<cstring>
#include<vector>
#include<stdio.h>
using namespace std;
class cstr{
	private:
		vector<char>a;
		int len;
	public:
		void clear(){
			a.clear();
			len=0;
		}
		const int size()const{
			return len;
		}
		const int length()const{
			return len;
		}
		void reserve(int num){
			a.reserve(num);
		}
		void pop_back(){
			a.pop_back();
			len--;
		}
		void push_back(char v){
			a.push_back(v);
			len++;
		}
		void push_chars(const char*v){
			int lenv=strlen(v);
			reserve(lenv+10);
			for(int i=0;i<lenv;i++)push_back(v[i]);
		}
		void push_cstr(cstr&v){
			int lenv=v.size();
			reserve(lenv+10);
			for(int i=0;i<lenv;i++)push_back(v[i]);
		}
		cstr(const char*init){
			clear();
			push_chars(init);
		}
		cstr(){
			clear();
			reserve(10);
			len=0;
		}
		char operator[](int p)const{
			return this->a[p];
		}
		char&operator[](int p){
			return this->a[p];
		}
  		cstr operator=(cstr v){
			if(this==&v)return*this;
			this->clear();
			this->reserve(v.size()+10);
			for(int i=0;i<v.size();i++)this->push_back(v[i]);;
    		return *this;
		}
		cstr&operator=(const char*v){
			int lenv=strlen(v);
			this->clear();
			this->reserve(lenv+10);
			for(int i=0;i<=lenv;i++)this->push_back(v[i]);
			return *this;
		}
		cstr&operator+=(const char*v){
			int lena=this->len,lenv=strlen(v);
			this->reserve(lena+lenv+10);
			for(int i=0;i<lenv;i++)this->push_back(v[i]);
			return*this;
		}
		cstr operator+(const char*v){
			int lenv=strlen(v),lena=this->size();
    		cstr ans;
   		 	for(int i=0;i<lena;i++)ans.push_back(this->a[i]);
    		for(int i=0;i<lenv;i++)ans.push_back(v[i]);
   			return ans;
		}
		void charsit(char*v){
			for(int i=0;i<len;i++)v[i]=a[i];
		}
	    void getcstr(char stop){
			char num;
			bool fir=true;
			while(num!=stop||fir){
				num=getchar();
				push_back(num);
				fir=false;
			}
			return;
		}
		void getcstr(){
			getcstr('\n');
		}
		friend istream&operator>>(istream&,cstr&);
		friend ostream&operator<<(ostream&,cstr&);
		friend cstr operator+(const char*,cstr&);
		friend cstr operator+(cstr&,cstr&);
};
istream&operator>>(istream&input,cstr&str){
	str.clear();
	char ch=getchar();
	while(ch==' '||ch=='\n'||ch=='\r')ch=getchar(); 
	while(ch!=' '&&ch!='\n'&&ch!='\r'){
		str.push_back(ch);
		ch=getchar();
	} 
	return input;
}
ostream&operator<<(ostream&output,const cstr&str){
	for(int i=0;i<str.size();i++)putchar(str[i]);
	return output;
}
ostream&operator<<(ostream&output,cstr&str){
	for(int i=0;i<str.size();i++)putchar(str[i]);
	return output;
}
cstr operator+(const char*p,cstr&v){
	int lena=strlen(p),lenv=v.size();
    cstr ans;
    for(int i=0;i<lena;i++)ans.push_back(p[i]);
    for(int i=0;i<lenv;i++)ans.push_back(v[i]);
   	return ans;
}
cstr operator+(cstr&a,cstr&v){
	int lena=a.size(),lenv=v.size();
	cstr ans;
    for(int i=0;i<lena;i++)ans.push_back(a[i]);
    for(int i=0;i<lenv;i++)ans.push_back(v[i]);
   	return ans;
}
cstr operator+(const char v,cstr&a){
	int lena=a.size();
	cstr ans;
    ans.push_back(v);
    for(int i=0;i<lena;i++)ans.push_back(a[i]);
   	return ans;
}
cstr add(cstr str1,cstr str2){
    cstr str;
    int len1=str1.length();
    int len2=str2.length();
    if(len1<len2)
        for(int i=1;i<=len2-len1;i++)
           str1="0"+str1;
    else
        for(int i=1;i<=len1-len2;i++)
           str2="0"+str2;
    len1=str1.length();
    int cf=0;
    int temp;
    for(int i=len1-1;i>=0;i--){
        temp=str1[i]-'0'+str2[i]-'0'+cf;
        cf=temp/10;
        temp%=10;
        str=char(temp+'0')+str;
    }
    if(cf!=0)str=char(cf+'0')+str;
    return str;
}
cstr a,b;
int main(){
	cin>>a>>b;
	cout<<add(a,b);
	return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...