6 条题解

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

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

  • 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-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-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;
          }
          
          • -3
            @ 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
          难度
          8
          标签
          递交数
          155
          已通过
          23
          上传者