- 分享
高精度-函数模板
- @ 2025-7-9 10:03:51
函数模板
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 条评论
-
xsm陶品旭 LV 6 @ 2025-7-9 20:55:17string 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:32string 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