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
          标签
          递交数
          135
          已通过
          14
          上传者