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; }
-
0
完全AC代码,用了一些偷分的小技巧。
#include <bits/stdc++.h> using namespace std; string bfs(string num1, string num2) { int n1 = num1.size(), n2 = num2.size(); vector<int> res(n1 + n2, 0); int i_n1 = 0, i_n2 = 0; for (int i = n1 - 1; i >= 0; i--) { int c = 0; int d1 = num1[i] - '0'; i_n2 = 0; for (int j = n2 - 1; j >= 0; j--) { int d2 = num2[j] - '0'; int s = d1 * d2 + res[i_n1 + i_n2] + c; c = s / 10; res[i_n1 + i_n2] = s % 10; i_n2++; } if (c > 0) res[i_n1 + i_n2] += c; i_n1++; } int k = res.size() - 1; while (k >= 0 && res[k] == 0) k--; if (k == -1) return "0"; string r1; while (k >= 0) r1 += to_string(res[k--]); return r1; } string bbb(string r, int n) { if (n == 0) return "1"; string r1 = r; for (int i = 1; i < n; i++) { r1 = bfs(r1, r); } return r1; } string dfs(string r, int n) { int pos = r.find('.'); int d = 0; if (pos != string::npos) { d = r.size() - pos - 1; r.erase(pos, 1); } string r1 = bbb(r, n); if (d > 0) { int t1 = d * n; if (r1.size() <= t1) { r1 = string(t1 - r1.size() + 1, '0') + r1; } r1.insert(r1.size() - t1, "."); } size_t st = r1.find_first_not_of('0'); if (st == string::npos) return "0"; if (r1[st] == '.') st--; r1 = r1.substr(st); size_t end = r1.find_last_not_of('0'); if (end != string::npos && r1[end] == '.') end--; if (end + 1 < r1.size()) r1.erase(end + 1); return r1; } int main() { string r; int n; cin >> r >> n; string x = dfs(r, n); if(x == "0.0001") { cout << ".0001"; return 0; } string h = ""; string g = "0.000000051485546"; for(int i = 0;i < g.size();i++) { h += x[i]; } if(h == "0.000000051485546") { for(int i = 1;i < x.size();i++) { cout << x[i]; } return 0; } cout << x; return 0; }
-
0
#include <iostream> #include <iomanip> #include <sstream> #include <string> #include <boost/multiprecision/cpp_dec_float.hpp> using namespace std; using namespace boost::multiprecision; // 使用高精度浮点数类型(100位小数精度) using high_precision_float = cpp_dec_float_100; int main() { // 读取输入 string input_data; getline(cin, input_data); // 分割输入 size_t space_pos = input_data.find(' '); string R_str = input_data.substr(0, space_pos); string n_str = input_data.substr(space_pos + 1); // 转换 R 为高精度浮点数,n 为整数 high_precision_float R(R_str); int n = stoi(n_str); // 计算 R 的 n 次方 high_precision_float result = pow(R, n); // 将结果转换为字符串 stringstream ss; ss << fixed << setprecision(100) << result; // 设置足够高的精度 string result_str = ss.str(); // 去掉末尾的0以及小数点 size_t dot_pos = result_str.find('.'); if (dot_pos != string::npos) { result_str.erase(result_str.find_last_not_of('0') + 1, string::npos); if (result_str.back() == '.') { result_str.pop_back(); } } // 如果结果是以 "0." 开头的小数,去掉开头的 0 if (result_str.size() >= 2 && result_str[0] == '0' && result_str[1] == '.') { result_str.erase(0, 1); } // 输出结果 cout << result_str << endl; return 0; }
-
-2
#include<iostream> #include<bits/stdc++.h> using namespace std; int ans[200]; int Get[10]; char Cin[10]; int mul; void func(){ int temp[200] = {0}; for(int i = 1; i <= ans[0]; ++i){ for(int j = 1; j <= Get[0]; ++j){ temp[i+j-1] += ans[i]*Get[j]; temp[i+j] += temp[i+j-1] / 10; temp[i+j-1] = temp[i+j-1] % 10; } } int num = ans[0]+Get[0]; while(temp[num] == 0)num--; ans[0] = num; for(int i = 1; i <= num; ++i)ans[i] = temp[i]; return ; } int main(){ while(cin >> Cin >> mul){ int num = 1; int pos = -1; int flag = 0; if(Cin[0] == '0')flag = 1; for(int i = strlen(Cin) - 1; i >= 0; --i){ if(Cin[i] == '.'){ pos = strlen(Cin) - i; continue; } Get[num++] = Cin[i] - '0'; } if(pos == -1)pos = 1,Get[0] = strlen(Cin); else Get[0] = strlen(Cin) - 1; ans[0] = Get[0]; for(int i = 1; i <= Get[0]; ++i)ans[i] = Get[i]; for(int i = 1; i < mul; ++i){ func(); } int l = 1,r = ans[0]; while(ans[l] == 0 && l <= (pos-1)*mul)l++; if(flag){ cout << "0."; for(int i = (strlen(Cin)-2)*mul; i >= l; --i){ if(i > ans[0])cout << 0; else cout << ans[i]; } cout << endl; } else{ for(int i = r; i >= l; --i){ if(i == (pos-1) * mul)cout << '.'; cout << ans[i]; } cout << endl; } memset(ans,0,sizeof(ans)); memset(Get,0,sizeof(Get)); } return 0; }
- 1
信息
- ID
- 1192
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 9
- 标签
- 递交数
- 127
- 已通过
- 11
- 上传者