函数模板

string sub(string a,string b){
	//倒叙存储
	int lena = a.size();
	for(int i=0;i<lena;i++){
		arr[i] = a[lena-1-i] -'0';
	}
	int lenb = b.size();
	for(int i=0;i<lenb;i++){
		brr[i] = b[lenb-1-i] -'0';
	}
	//模拟
	int jiewei = 0,i=0;
	string ans="";
	while(i<lena){
		int x=arr[i];
		int y=(i<lenb? brr[i] : 0);
		int temp = x-y-jiewei;
		if(temp<0){
			temp+=10;
			jiewei = 1;
		} 
		else{
			jiewei =0;
		}
		ans+=(temp+'0');
		i++;
	}
	//前导0  123 122  1
	while(ans.size()>1 &&ans.back()=='0'){
		ans.pop_back();
	}
	reverse(ans.begin(),ans.end());
	
	return ans;
}

string add(string a, string b) {
	string ans = "";
	reverse(a.begin(), a.end());
	reverse(b.begin(), b.end());
	
	int carry = 0, i = 0;
	int lenA = a.size(), lenB = b.size();
	while (i < a.size() || i < b.size() || carry) {
		int sum = carry;
		if (i < lenA) sum += a[i] - '0';
		if (i < lenB) sum += b[i] - '0';
		carry = sum / 10;
		ans += (sum % 10) + '0';
		i++;
	}
	reverse(ans.begin(), ans.end());
	return ans;
}


string multiply(string a, string b) {
    if (a == "0" || b == "0") return "0";

    int len1 = a.size(), len2 = b.size();
    int crr[2005] = {}; // 最多 len1 + len2 位

    // 反向相乘并存储到 crr[]
    for (int i = len1 - 1; i >= 0; --i) {
        for (int j = len2 - 1; j >= 0; --j) {
            int mul = (a[i] - '0') * (b[j] - '0');
            int p1 = i + j, p2 = i + j + 1;
            int sum = mul + crr[p2];

            crr[p2] = sum % 10;
            crr[p1] += sum / 10;
        }
    }

    // 转换为字符串,跳过前导0
    string result;
    bool started = false;
    for (int i = 0; i < len1 + len2; ++i) {
        if (!started && crr[i] == 0) continue;
        started = true;
        result += (crr[i] + '0');
    }

    return result.empty() ? "0" : result;
}

2 条评论

  • @ 2025-7-9 20:55:17
    string sub(string a,string b){//减法函数定义
    	//倒叙存储
    	int lena = a.size();// 字符串a的长度
    	for(int i=0;i<lena;i++){//循循环遍历  
    		arr[i] = a[lena-1-i] -'0';//字符串转换成数字
    	}
    	int lenb = b.size();//字符串b的长度  
    	for(int i=0;i<lenb;i++){//循环遍历  
    		brr[i] = b[lenb-1-i] -'0';//字符串b转换成数字
    	}
    	//模拟
    	int jiewei = 0,i=0;//定义两个变量
    	string ans="";//把字符串设为空 
    	while(i<lena){//循环遍历  
    		int x=arr[i];//把X设为被减数 
    		int y=(i<lenb? brr[i] : 0);//不知道  
    		int temp = x-y-jiewei;//进行减法  
    		if(temp<0){ //判断借位
    			temp+=10; 
    			jiewei = 1;
    		} 
    		else{// 没有借位
    			jiewei =0;
    		}
    		ans+=(temp+'0');// 保存结果
    		i++;//继续下个数位
    	}
    	//前导0  123 122  1
    	while(ans.size()>1 &&ans.back()=='0'){// 循环便利
    		ans.pop_back();//去掉前导0
    	}
    	reverse(ans.begin(),ans.end());// 倒序字符串
    	
    	return ans;// 返回字符串
    }
    
    string add(string a, string b) {//加法函数
    	string ans = "";// 字符串设为空
    	reverse(a.begin(), a.end());// 倒序a
    	reverse(b.begin(), b.end());// 倒序b
    	
    	int carry = 0, i = 0;// 定义两个变量
    	int lenA = a.size(), lenB = b.size();// 将两个数组的长度记录下来
    	while (i < a.size() || i < b.size() || carry) {// 循环遍历
    		int sum = carry;// 将这一位的结果设为进位
    		if (i < lenA) sum += a[i] - '0';// 将这一位的数组a转换成数字,加到sun里 
    		if (i < lenB) sum += b[i] - '0';// 将这一位的数组b转换成数字,加到sun里 
    		carry = sum / 10;// 算出进位
    		ans += (sum % 10) + '0';// 将这一位的数存到字符串里
    		i++;// 进行下一位便利
    	}
    	reverse(ans.begin(), ans.end());// 倒序
    	return ans;// 返回ans
    }
    
    
    • @ 2025-7-9 12:52:32
      string add(string a, string b) {//函数 返回值 string  a,b是加数; 
      	reverse(a.begin(), a.end());//反过来 :好进位 
      	reverse(b.begin(), b.end());// 反过来 
      	int carry = 0, i = 0;//模拟   carry:进位 i:下标 
      	int lenA = a.size(), lenB = b.size();//保存ab长度 
      	while (i < lenA || i < lenB || carry) {  
      		int sum = carry;//保存和 
      		if (i < lenA) sum += a[i] - '0'//a加数  
      		if (i < lenB) sum += b[i] - '0';//b加数 
      		carry = sum / 10;// 更新进位的值 
      		ans += (sum % 10) + '0';//获取个位 拼接 
      		i++;//i自增1 
      	} 
      	reverse(ans.begin(), ans.end());//把ans反过来 
      	return ans;//返回ans 
      }
      
      • 1