4 条题解

  • 3

    C++高精度函数写法

    #include <iostream>
    #define N 10010
    
    using namespace std;
    
    string a, b;
    //以下三个函数高精除法(取余)要用到
    int compare(int x[], int y[]){ //比较两个高精数据(数组)大小,x大于y返回1,小于返回-1,等于返回0
    	if(x[0] != y[0]) return x[0] > y[0] ? 1 : -1;
    	for(int i = x[0]; i; i--){
    		if(x[i] > y[i]) return 1;
    		if(x[i] < y[i]) return -1;
    	}
    	return 0;
    }
    
    void copy(int x[], int y[], int step){ //将y右移step位赋值给x,即 x = y * 10 ^ step
    	for(int i = 1; i <= y[0]; i++) x[i + step] = y[i];
    	x[0] = y[0] + step;
    }
    
    void sub(int x[], int y[]){ //模拟减法竖式运算
    	for(int i = 1; i <= x[0]; i++){
    		if(x[i] < y[i]){
    			x[i + 1]--;
    			x[i] += 10;
    		}
    		x[i] -= y[i];
    	}
    	while(!x[x[0]] && x[0]) x[0]--;
    }
    
    string _add(string x, string y){ //高精度加法
    	string res;
    	int nx[N] = {0}, ny[N] = {0}, ans[N + 1] = {0};
    	nx[0] = x.size(), ny[0] = y.size(), ans[0] = max(nx[0], ny[0]) + 1; //数组第0位存储长度
    	for(int i = nx[0]; i; i--) nx[i] = x[nx[0] - i] - '0'; //逆序存储
    	for(int i = ny[0]; i; i--) ny[i] = y[ny[0] - i] - '0';
    	for(int i = 1; i <= ans[0]; i++){ //模拟加法竖式运算
    		ans[i + 1] += (ans[i] + nx[i] + ny[i]) / 10;
    		ans[i] = (ans[i] + nx[i] + ny[i]) % 10;
    	}
    	while(!ans[ans[0]] && ans[0]) ans[0]--; //去除前导0
    	if(!ans[0]) return "0"; //如果长度为0直接返回0
    	for(int i = ans[0]; i; i--) res += ans[i] + '0'; //逆序回来并返回
    	return res;
    }
    
    string _minus(string x, string y){ //高精度减法
    	if(x.size() < y.size() || x.size() == y.size() && x < y) return "-" + _minus(y, x); //如果 x < y 返回 - (y - x)
    	string res;
    	int nx[N] = {0}, ny[N] = {0};
    	nx[0] = x.size(), ny[0] = y.size();
    	for(int i = nx[0]; i; i--) nx[i] = x[nx[0] - i] - '0';
    	for(int i = ny[0]; i; i--) ny[i] = y[ny[0] - i] - '0';
    	for(int i = 1; i <= nx[0]; i++){ //模拟减法竖式运算(可用上面sub函数代替)
    		if(nx[i] < ny[i]){
    			nx[i + 1]--;
    			nx[i] += 10;
    		}
    		nx[i] -= ny[i];
    	}
    	while(!nx[nx[0]] && nx[0]) nx[0]--;
    	if(!nx[0]) return "0";
    	for(int i = nx[0]; i; i--) res += nx[i] + '0';
    	return res;
    }
    
    string _mult(string x, string y){ //高精度乘法
    	string res;
    	int nx[N] = {0}, ny[N] = {0}, ans[N << 1] = {0};
    	nx[0] = x.size(), ny[0] = y.size(), ans[0] = nx[0] + ny[0];
    	for(int i = nx[0]; i; i--) nx[i] = x[nx[0] - i] - '0';
    	for(int i = ny[0]; i; i--) ny[i] = y[ny[0] - i] - '0';
    	for(int i = 1; i <= nx[0]; i++){ //模拟乘法竖式运算
    		for(int j = 1; j <= ny[0]; j++){
    			ans[i + j] += (ans[i + j - 1] + nx[i] * ny[j]) / 10;
    			ans[i + j - 1] = (ans[i + j - 1] + nx[i] * ny[j]) % 10;
    		}
    	}
    	while(!ans[ans[0]] && ans[0]) ans[0]--;
    	if(!ans[0]) return "0";
    	for(int i = ans[0]; i; i--) res += ans[i] + '0';
    	return res;
    }
    
    string _div(string x, string y){ //高精度除法
    	if(x.size() < y.size() || x.size() == y.size() && x < y) return "0"; //如果 x < y 返回 0
    	string res;
    	int nx[N] = {0}, ny[N] = {0}, ans[N] = {0};
    	nx[0] = x.size(), ny[0] = y.size(), ans[0] = nx[0] - ny[0] + 1;
    	for(int i = nx[0]; i; i--) nx[i] = x[nx[0] - i] - '0';
    	for(int i = ny[0]; i; i--) ny[i] = y[ny[0] - i] - '0';
    	for(int i = ans[0]; i; i--){ //模拟除法竖式运算
    		int temp[N] = {0};
    		copy(temp, ny, i - 1);
    		while(compare(nx, temp) >= 0){
    			sub(nx, temp);
    			ans[i]++;
    		}
    	}
    	while(!ans[ans[0]] && ans[0]) ans[0]--;
    	for(int i = ans[0]; i; i--) res += ans[i] + '0';
    	return res;
    }
    
    string _mod(string x, string y){ //高精度取余
    	if(x.size() < y.size() || x.size() == y.size() && x < y) return x; //如果 x < y 返回 x
    	string res;
    	int nx[N] = {0}, ny[N] = {0};
    	nx[0] = x.size(), ny[0] = y.size();
    	for(int i = nx[0]; i; i--) nx[i] = x[nx[0] - i] - '0';
    	for(int i = ny[0]; i; i--) ny[i] = y[ny[0] - i] - '0';
    	for(int i = nx[0] - ny[0] + 1; i; i--){ //模拟除法竖式运算
    		int temp[N] = {0};
    		copy(temp, ny, i - 1);
    		while(compare(nx, temp) >= 0){
    			sub(nx, temp);
    		}
    	}
    	if(!nx[0]) return "0";
    	for(int i = nx[0]; i; i--) res += nx[i] + '0';
    	return res;
    }
    
    int main()
    {
    	ios::sync_with_stdio(false);
    	cin.tie(0);
    	cout.tie(0);
    	cin >> a >> b;
    	cout << _add(a, b) << endl;
    	cout << _minus(a, b) << endl;
    	cout << _mult(a, b) << endl;
    	cout << _div(a, b) << endl;
    	cout << _mod(a, b) << endl;
    	return 0;
    }
    

    不过这道题为十六进制,所以需稍加改动

    #include <iostream>
    #define N 10010
    
    using namespace std;
    
    string a, b;
    
    string _add(string x, string y){
    	string res;
    	int nx[N] = {0}, ny[N] = {0}, ans[N + 1] = {0};
    	nx[0] = x.size(), ny[0] = y.size(), ans[0] = max(nx[0], ny[0]) + 1;
    	for(int i = nx[0]; i; i--){
            if(isdigit(x[nx[0] - i])) nx[i] = x[nx[0] - i] - '0';
            else nx[i] = x[nx[0] - i] - 'A' + 10;
        }
    	for(int i = ny[0]; i; i--){
            if(isdigit(y[ny[0] - i])) ny[i] = y[ny[0] - i] - '0';
            else ny[i] = y[ny[0] - i] - 'A' + 10;
        }
    	for(int i = 1; i <= ans[0]; i++){
    		ans[i + 1] += (ans[i] + nx[i] + ny[i]) / 16;
    		ans[i] = (ans[i] + nx[i] + ny[i]) % 16;
    	}
    	while(!ans[ans[0]] && ans[0]) ans[0]--;
    	if(!ans[0]) return "0";
    	for(int i = ans[0]; i; i--){
            if(ans[i] >= 0 && ans[i] <= 9) res += ans[i] + '0';
            else res += ans[i] + 'A' - 10;
        }
    	return res;
    }
    
    int main()
    {
    	ios::sync_with_stdio(false);
    	cin.tie(0);
    	cout.tie(0);
    	cin >> a >> b;
    	cout << _add(a, b) << endl;
    	return 0;
    }
    

    信息

    ID
    98
    时间
    1000ms
    内存
    128MiB
    难度
    7
    标签
    递交数
    354
    已通过
    84
    上传者