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;
            }
            
            • -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
            标签
            递交数
            127
            已通过
            11
            上传者