6 条题解
-
0
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
- 上传者