6 条题解

  • 2
    @ 2024-12-6 19:31:22

    有没有大佬发个AC解题,不会做呀!!只有80分解题!!😕谁能教我,他(她)就是我的再生父母!!!

    • 1
      @ 2025-7-21 11:27:23

      完全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
        @ 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;
        }
        
        • 0
          @ 2025-3-2 8:45:37

          赵老师连0都忘打了

          kkkkkkkkkk

          • 0
            @ 2025-2-14 20:41:23
            #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
              @ 2023-9-26 22:45:54
              #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;
              }
              
              • @ 2023-9-26 22:46:13

                求助,只有80分

              • @ 2023-10-20 10:51:25

                有无大佬帮忙改正

            • 1

            信息

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