P6745 『MdOI R3』Number 题解
Content
给定 \(k,x\) ,请将 \(10^k+x\) 转写成一般形式。
数据范围:\(0\leqslant k\leqslant 500, 0\leqslant x\leqslant 10^{18}\)。
Solution
我们看到这里的 \(k\) 可以到 \(500\) ,因此直接用 \(\texttt{pow}\) 求出来肯定是不现实的,因此需要用字符串。
像在这里的话,我们可以直接把 \(10^k\) 和 \(x\) 分开来存储到两个字符串里面,然后的做法类似于高精加,就是把这两个数加起来就可以了。
总体来说难度不算大。
(Upd on 2021.12.23)这道题目后来又想了一下,发现在 \(x<10^{18}\),\(k\geqslant 18\) 的时候并不需要高精加,而是直接将 \(x\) 拼到后面去就可以了。因此,这篇题解不是正解,仅供一个暴力思路的参考。
Code
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;
int k;
long long x;
char a[507], b[507];
int main() {
scanf("%d%lld", &k, &x);
int lena = k + 1, lenb = 0;
a[0] = '1';
for(int i = 1; i <= k; ++i)
a[i] = '0';
long long p = x;
// printf("%d\n", p);
int numb[27] = {0}, cnt = 0;
while(p) {
numb[++cnt] = p % 10;
p /= 10;
}
for(int i = cnt; i >= 1; --i)
b[lenb++] = numb[i] + '0';
// puts("");
// printf("%s %s\n", a, b);
int aa[507] = {0}, bb[507] = {0}, ans[507] = {0};
for(int i = 0; i < lena; ++i) aa[lena - i] = a[i] - '0';
for(int i = 0; i < lenb; ++i) bb[lenb - i] = b[i] - '0';
int lenc = 1, xx = 0;
while(lenc <= lena || lenc <= lenb) {
// printf("%d %d %d\n", aa[lenc], bb[lenc], xx);
ans[lenc] = aa[lenc] + bb[lenc] + xx;
xx = ans[lenc] / 10;
ans[lenc] %= 10;
// printf("%d\n", ans[lenc]);
lenc++;
}
ans[lenc] = xx;
while(!ans[lenc]) lenc--;
for(int i = lenc; i >= 1; --i)
printf("%d", ans[i]);
return 0;
}

浙公网安备 33010602011771号