如图问题
{:10_266:} 成功屏蔽GPT{:10_256:} 一定要c/c++吗 liuhongrun2022 发表于 2023-9-24 12:09
一定要c/c++吗
嗯……C++不行吗? liuhongrun2022 发表于 2023-9-24 12:09
一定要c/c++吗
想看看能不能实现 一个高精度幂的模板,输入两个数字,然后按回车。
#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: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;
}
另外,这两个例子都是C++的 我要最佳答案!
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$ isdkz用的机器人好像可以看图片
页:
[1]