题目描述
快速幂+高精度*高精度
样例
2 3.14
13
错误算法❌
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
int turn(int x,double d){
for(int i=1;i<=x;i++){
d=d*2.0;
}
return d;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,res;
double d;
cin>>n>>d;
res=turn(n,d);
cout<<res<<endl;
return 0;
}
这样输出的结果为12
正确算法
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
void mul(vector<int>& A, int b) // A *= b 高精度乘法
{
int t = 0;
for (int i = 0; i < A.size(); i ++ )
{
t += A[i] * b;
A[i] = t % 10;
t /= 10;
}
if (t) A.push_back(t);
}
void add(vector<int>& A, int k, int b) //高精度加法
{
int t = b;
for (int i = k; i < A.size(); i ++ )
{
t += A[i];
A[i] = t % 10;
t /= 10;
}
if (t) A.push_back(t);
}
int main()
{
int n;
string d; //高精度利用数组进行
cin >> n >> d;
reverse(d.begin(), d.end()); //数组逆序
int dot = d.find('.');
vector<int> D;
for (auto c: d)
if (c != '.')
D.push_back(c - '0');
while (n -- ) mul(D, 2);
if (D[dot - 1] >= 5) add(D, dot, 1); //四舍五入操作
for (int i = D.size() - 1; i >= dot; i -- ) //逆序输出
cout << D[i];
return 0;
}