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;
}
posted @ 2021-12-23 20:30  Eason_AC  阅读(64)  评论(0)    收藏  举报