1 条题解
-
0
自动搬运
来自洛谷,原作者为

程老师
Mr Cheng搬运于
2025-08-24 21:25:58,当前版本为作者最后更新于2018-02-21 10:21:26,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
【分析】
抛开小数不谈,本题求a^n,由于数字较大,要用到高精算法,n的值不大,可以不用快速幂。
本题a可能是小数,可以这样解决,先记录a的小数位数pt,并将a乘以10^pt,转化为整数a′,求出a′^n,设为s′,答案等于s′/(10×pt×n),即输出时将s′的末尾pt×n位作为小数输出即可。
例:求1.25^2,先求125^2,等于15625,由于1.25有两位小数,1.25^2就有4位小数,所有结果等于1.5625。
【代码】
#include <bits/stdc++.h> using namespace std; const int MAXN = 1300; //100000^250有1250位 int pt; struct Bign{ int s[MAXN], len; Bign(int num = 0){ memset(s, 0, sizeof(s)); len = 1; s[1] = num; } Bign operator * (int b)const{ Bign c; c.len = len + 10; for (int i = 1; i <= c.len; i++){ c.s[i] += s[i] * b; c.s[i+1] = c.s[i] / 10; c.s[i] %= 10; } c.clean(); return c; } void clean(){ while (len > 1 && !s[len]) len--; } }; ostream& operator << (ostream &out, const Bign &x){ int i; for (i = x.len; i > 0 && i > pt; i--) //输出整数部分 out << x.s[i]; if (i){ //若i不为0,表示还有小数部分 out << "."; //先输出"." for (i = pt; i > 0; i--) //再输出小数部分 out << x.s[i]; } return out; } int main(){ double a; int n; while (cin >> a >> n){ //求a的小数位数 pt = 0; //pt记录a的小数位数 while (fabs(a - round(a)) > 1e-6){ //若a不等于a的整数部分,表示a不是整数 pt++; //小数位数加一位 a *= 10; } pt *= n; //a^n的小数位数等于a的小数位数 ×n //求s = a ^ n Bign s = 1; for (int i = 1; i <= n; i++) s = s * (int)round(a); cout << s << endl; } return 0; }
- 1
信息
- ID
- 510
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者