奋斗中的鱼 发表于 2023-9-24 12:06:59

如图问题


{:10_266:}

奋斗中的鱼 发表于 2023-9-24 12:07:53

成功屏蔽GPT{:10_256:}

liuhongrun2022 发表于 2023-9-24 12:09:42

一定要c/c++吗

奋斗中的鱼 发表于 2023-9-24 12:10:10

liuhongrun2022 发表于 2023-9-24 12:09
一定要c/c++吗

嗯……C++不行吗?

奋斗中的鱼 发表于 2023-9-24 12:11:44

liuhongrun2022 发表于 2023-9-24 12:09
一定要c/c++吗

想看看能不能实现

liuhongrun2022 发表于 2023-9-24 12:17:48

一个高精度幂的模板,输入两个数字,然后按回车。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <map>
#include <queue>
#include <set>
#include <vector>
using namespace std;
#define L(x) (1 << (x))
const double PI = acos(-1.0);
const int Maxn = 133015;
double ax, ay, bx, by;
char sa,sb;
int sum;
int x1,x2;
int revv(int x, int bits)
{
    int ret = 0;
    for (int i = 0; i < bits; i++)
    {
      ret <<= 1;
      ret |= x & 1;
      x >>= 1;
    }
    return ret;
}
void fft(double * a, double * b, int n, bool rev)
{
    int bits = 0;
    while (1 << bits < n) ++bits;
    for (int i = 0; i < n; i++)
    {
      int j = revv(i, bits);
      if (i < j)
            swap(a, a), swap(b, b);
    }
    for (int len = 2; len <= n; len <<= 1)
    {
      int half = len >> 1;
      double wmx = cos(2 * PI / len), wmy = sin(2 * PI / len);
      if (rev) wmy = -wmy;
      for (int i = 0; i < n; i += len)
      {
            double wx = 1, wy = 0;
            for (int j = 0; j < half; j++)
            {
                double cx = a, cy = b;
                double dx = a, dy = b;
                double ex = dx * wx - dy * wy, ey = dx * wy + dy * wx;
                a = cx + ex, b = cy + ey;
                a = cx - ex, b = cy - ey;
                double wnx = wx * wmx - wy * wmy, wny = wx * wmy + wy * wmx;
                wx = wnx, wy = wny;
            }
      }
    }
    if (rev)
    {
      for (int i = 0; i < n; i++)
            a /= n, b /= n;
    }
}
int solve(int a[],int na,int b[],int nb,int ans[])
{
    int len = max(na, nb), ln;
    for(ln=0; L(ln)<len; ++ln);
    len=L(++ln);
    for (int i = 0; i < len ; ++i)
    {
      if (i >= na) ax = 0, ay =0;
      else ax = a, ay = 0;
    }
    fft(ax, ay, len, 0);
    for (int i = 0; i < len; ++i)
    {
      if (i >= nb) bx = 0, by = 0;
      else bx = b, by = 0;
    }
    fft(bx, by, len, 0);
    for (int i = 0; i < len; ++i)
    {
      double cx = ax * bx - ay * by;
      double cy = ax * by + ay * bx;
      ax = cx, ay = cy;
    }
    fft(ax, ay, len, 1);
    for (int i = 0; i < len; ++i)
      ans = (int)(ax + 0.5);
    return len;
}
string mul(string sa,string sb)
{
    int l1,l2,l;
    int i;
    string ans;
    memset(sum, 0, sizeof(sum));
    l1 = sa.size();
    l2 = sb.size();
    for(i = 0; i < l1; i++)
      x1 = sa-'0';
    for(i = 0; i < l2; i++)
      x2 = sb-'0';
    l = solve(x1, l1, x2, l2, sum);
    for(i = 0; i<l || sum >= 10; i++)
    {
      sum += sum / 10;
      sum %= 10;
    }
    l = i;
    while(sum <= 0 && l>0)
    for(i = l; i >= 0; i--)    ans+=sum + '0';
    return ans;
}
string Pow(string a,int n)
{
    if(n==1) return a;
    if(n&1) return mul(Pow(a,n-1),a);
    string ans=Pow(a,n/2);
    return mul(ans,ans);
}
int main()
{
    cin.sync_with_stdio(false);
    string a;
    int b;
    while(cin>>a>>b) cout<<Pow(a,b)<<endl;
    return 0;
}

liuhongrun2022 发表于 2023-9-24 12:24:31

本帖最后由 liuhongrun2022 于 2023-9-24 12:25 编辑

高精度乘法模板加循环也行(和第一个比简单很多)
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

const int L=110;

string mul(string a, string b)
{
    string s;
    int na, nb, nc, La = a.size(), Lb = b.size();
    fill(na,na+L,0); fill(nb,nb+L,0); fill(nc,nc+L,0);
    for(int i = La - 1; i >= 0; i--) na = a - '0';
    for(int i = Lb - 1; i >= 0; i--) nb = b - '0';
    for(int i = 1; i <= La; i++)
      for(int j = 1; j <= Lb; j++)
            nc += na * nb;
    for(int i = 1; i <= La + Lb; i++)
      nc += nc / 10, nc %= 10;
    if(nc) s += nc + '0';
    for(int i = La + Lb - 1; i >= 1; i--)
      s += nc + '0';
    return s;
}

int main()
{
    string a;
    int exponent;
    while(cin >> a >> exponent)
    {
      string result = "1";
      for (int i = 0; i < exponent; i++)
      {
            result = mul(result, a);
      }
      cout << result << endl;
    }
    return 0;
}

liuhongrun2022 发表于 2023-9-24 12:27:09

另外,这两个例子都是C++的

liuhongrun2022 发表于 2023-9-24 12:31:11

我要最佳答案!

人造人 发表于 2023-9-24 14:42:04

sh-5.1$ cat main.cpp
#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>

using std::cin, std::cout, std::endl;
using boost::multiprecision::cpp_int;
using boost::multiprecision::pow;

int main() {
    cout << pow(cpp_int(2), 100) << endl;
    return 0;
}
sh-5.1$ ./main
1267650600228229401496703205376
sh-5.1$

歌者文明清理员 发表于 2023-9-24 21:06:43

isdkz用的机器人好像可以看图片
页: [1]
查看完整版本: 如图问题