很显然是贪心做法,从后往前取不超过n的数再乘上权重,相加即可。
我做的时候也是想从后往前,但是我想用的是dp,用dp【i】【j】表示倒数第 i 位作为第 j 各权重的最小值
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
ll ans;
ll q_pow(ll a,ll b)
{
ll ans = 1;
while(b){
if(b&1) ans = ans * a;
a = a * a;
b >>= 1;
}
return ans;
}
int main()
{
//cout << pow(20,2) << endl;
ios_base::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
ll n;
int p = 0;///以n为进制的长度
string k;
cin >> n >> k;
int a = k.size();
ll r = n;
while(r){
r /= 10;
++ p;
}
//cout << p << endl;
ll u = 0;
ll z = 1;
ans = 0;
int x = 0;///已经计算的长度
for(int i = a-1;i >= 0;){
ll tmp = 0;
int first = i;
x = 0;
for(int j = i;;-- j){
if(j < 0 || x+1 > p || tmp + z*(k[j] - '0') >= n){
if(k[j+1] == '0' && j >= 0 && x > 1)
i = first - 1;
else
i = j;
z = 1;
break;
}
++ x;
if(k[j] != '0')
first = j;
tmp = tmp + z*(k[j] - '0');
z *= 10;
}
ll t = q_pow(n,u);
ans += t * tmp;
++u;
}
cout << ans << endl;
}
ps:这里有一个坑,如果逆从后往前贪心的取,那么取的数不能有前导0。