没加高精60分,加了高精只有50分了 代码如下
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
#define MAXN 50
#define maxn 60
struct Big_int {//高精度模板开始
int a[maxn];//a[0]用于储存长度,1-a[0]倒序储存
Big_int() { memset(a, 0, sizeof(a)); }
Big_int& operator = (const string s)
{
int k = 0;
for (int i = s.size() - 1; i >= 0; i--)
{
k++;
a[k] = s[i] - '0';
}
a[0] = s.size();
return *this;
}
Big_int& operator * (const int b)
{
int ncarry = 0;
for (int i = 1; i <= a[0]; i++) {
a[i] = a[i] * b + ncarry;
ncarry = a[i] / 10;
a[i] %= 10;
}
for (int i = a[0] + 1; ncarry > 0; i++, a[0]++) {
a[i] = ncarry % 10;
ncarry /= 10;
}
return *this;
}
Big_int& operator =(const int b)
{
int num = b, i = 0;
while (num != 0)
{
i++;
this->a[i] = num % 10;
num /= 10;
}
this->a[0] = i;
return *this;
}
Big_int operator + (const Big_int b)
{
Big_int c;
c.a[0] = max(a[0], b.a[0]);
for (int i = 1; i <= c.a[0]; i++)
{
c.a[i] += (a[i] + b.a[i]);
c.a[i + 1] += c.a[i] / 10;
c.a[i] %= 10;
}
if (c.a[c.a[0] + 1] > 0)
c.a[0]++;
return c;
}
bool operator <(const Big_int b)
{
if (this->a[0] < b.a[0])
return true;
if (this->a[0] > b.a[0])
return false;
for (int i = b.a[0]; i >= 1; i--)
{
if (this->a[i] != b.a[i])
return this->a[i] < b.a[i];
}
return false;
}
bool operator >(Big_int b)
{
return b < *this;
}
};
ostream& operator<<(ostream& out, const Big_int a)
{
for (int i = a.a[0]; i >= 1; i--)
out << a.a[i];
return out;
}
int N, K;
Big_int dfs(int num, int* s,int pos) {
Big_int ret;
long long tem = 0;
if (num == 0) {
for (int i = pos; i <= N - 1; i++) {
tem *= 10;
tem += s[i];
}
ret = tem;
return ret;
}
for (int i = pos+1 ; i <= N - num-1; i++) {
tem = 0;
for (int j = pos; j < i; j++) {
tem *= 10;
tem += s[j];
}
if (ret <(dfs(num - 1, s, i)*tem)) {
ret = (dfs(num - 1, s, i)*tem) ;
}
}
return ret;
}
int main() {
cin >> N >> K;
int a[MAXN] = {0};
char b[MAXN] = {0};
for (int i = 0; i < N; i++) {
cin>>b[i];
a[i] = b[i] - '0';
}
cout << dfs(K, a, 0);
return 0;
}