6 条题解

  • 0
    @ 2025-7-26 19:02:54

    AC代码

    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    // 高精度加法(兼容前导零)
    string add(const string& a, const string& b) {
        string res;
        int carry = 0, i = a.size() - 1, j = b.size() - 1;
        while (i >= 0 || j >= 0 || carry) {
            int sum = carry;
            if (i >= 0) sum += a[i--] - '0';
            if (j >= 0) sum += b[j--] - '0';
            carry = sum / 10;
            res.push_back(sum % 10 + '0');
        }
        reverse(res.begin(), res.end());
        return res;
    }
    
    // 高精度减法(确保 a >= b,兼容前导零)
    string subtract(const string& a, const string& b) {
        string res;
        int borrow = 0, i = a.size() - 1, j = b.size() - 1;
        while (i >= 0) {
            int diff = (a[i] - '0') - borrow;
            if (j >= 0) diff -= (b[j] - '0');
            
            if (diff < 0) {
                diff += 10;
                borrow = 1;
            } else {
                borrow = 0;
            }
            res.push_back(diff + '0');
            i--; j--;
        }
        // 移除前导零(保留至少一位)
        while (res.size() > 1 && res.back() == '0') res.pop_back();
        reverse(res.begin(), res.end());
        return res;
    }
    
    // 朴素大数乘法(确保低精度时更稳定)
    string multiply(const string& a, const string& b) {
        if (a == "0" || b == "0") return "0";
        vector<int> res(a.size() + b.size(), 0);
        for (int i = a.size() - 1; i >= 0; i--) {
            for (int j = b.size() - 1; j >= 0; j--) {
                int mul = (a[i] - '0') * (b[j] - '0');
                int sum = mul + res[i + j + 1];
                res[i + j + 1] = sum % 10;
                res[i + j] += sum / 10;
            }
        }
        string resStr;
        for (int num : res) {
            if (!(resStr.empty() && num == 0)) {
                resStr.push_back(num + '0');
            }
        }
        return resStr;
    }
    
    // 快速幂(兼容整数、小数)
    string fastPower(string base, int exponent) {
        string res = "1";
        while (exponent > 0) {
            if (exponent & 1) {
                res = multiply(res, base);
            }
            base = multiply(base, base);
            exponent >>= 1;
        }
        return res;
    }
    
    // 处理输入:分离数值与小数位数(关键修复!)
    pair<string, int> processInput(const string& s) {
        size_t dotPos = s.find('.');
        if (dotPos == string::npos) {
            // 整数,小数位数为 0
            return {s, 0};
        }
        // 分离整数部分和小数部分
        string intPart = s.substr(0, dotPos);
        string fracPart = s.substr(dotPos + 1);
        
        // 移除整数部分前导零(保留至少一个 0)
        size_t intStart = 0;
        while (intStart < intPart.size() - 1 && intPart[intStart] == '0') {
            intStart++;
        }
        intPart = intPart.substr(intStart);
        
        // 移除小数部分尾部零,计算有效小数位数
        size_t fracEnd = fracPart.size();
        while (fracEnd > 0 && fracPart[fracEnd - 1] == '0') {
            fracEnd--;
        }
        int fracDigits = fracEnd;
        fracPart = fracPart.substr(0, fracEnd);
        
        // 合并处理后的数值(整数 + 小数,无小数点)
        string num = intPart + fracPart;
        // 移除合并后的前导零(保留至少一个 0)
        size_t numStart = 0;
        while (numStart < num.size() - 1 && num[numStart] == '0') {
            numStart++;
        }
        num = num.substr(numStart);
        
        // 小数位数为有效小数部分长度
        return {num, fracDigits};
    }
    
    // 格式化结果(关键修复!)
    string formatResult(const string& num, int decimalDigits, int exponent) {
        if (num == "0") return "0";
        
        // 总小数位数 = 有效小数位数 * 指数
        int totalFrac = decimalDigits * exponent;
        if (totalFrac == 0) {
            // 无小数部分,直接返回整数
            return num;
        }
        
        // 插入小数点
        string res = num;
        if (totalFrac >= res.size()) {
            // 纯小数,补前导零
            res = string(totalFrac - res.size() + 1, '0') + res;
            res = "0." + res.substr(1); // 确保格式如 .0001
        } else {
            // 带整数部分的小数
            res = res.substr(0, res.size() - totalFrac) + "." + res.substr(res.size() - totalFrac);
        }
        
        // 移除尾部零和多余小数点
        size_t dotPos = res.find('.');
        if (dotPos != string::npos) {
            // 移除小数部分尾部零
            size_t fracEnd = res.size() - 1;
            while (fracEnd > dotPos && res[fracEnd] == '0') {
                fracEnd--;
            }
            res = res.substr(0, fracEnd + 1);
            // 移除小数点(如果小数部分全为零)
            if (fracEnd == dotPos) {
                res = res.substr(0, dotPos);
            }
        }
        
        // 处理纯小数前导零(如 0.0001 → .0001)
        if (res.size() > 1 && res[0] == '0' && res[1] == '.') {
            res = res.substr(1);
        }
        
        return res;
    }
    
    int main() {
        string R;
        int n;
        cin >> R >> n;
        
        auto [numPart, decimalDigits] = processInput(R);
        string powerResult = fastPower(numPart, n);
        string finalResult = formatResult(powerResult, decimalDigits, n);
        
        cout << finalResult << endl;
        return 0;
    }
    

    信息

    ID
    1192
    时间
    1000ms
    内存
    128MiB
    难度
    9
    标签
    递交数
    127
    已通过
    11
    上传者