AcWing 5987. R 格式
原题链接
简单
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
void mul(vector<int>&A,int b)
{
int t=0;
for(int i=0;i<A.size();i++)
{
//eg:36*2
t+=A[i]*2;//依次进行乘法,对此依次相加
A[i]=t%10;//处理这一位的数
t/=10;//将进位进行计算
}
if(t) A.push_back(t);
}
//12.32
void add(vector<int>&A,int b)
{
int t=1;//进位:
for(int i=b;i<A.size();i++)
{
t+=A[i];//如果需要进位,1去和其相加
A[i]=t%10;//处理这一位的数
t/=10;//将进位进行计算
}
if(t) A.push_back(t);
}
int main()
{
int n;
string b;
cin>>n>>b;//cin输入自动过滤空格,以后在处理字符串和数字优先选择cin
reverse(b.begin(),b.end());//逆序储存,减少循环
int dot=b.find('.');//发现小数点的位置,先进行计算
vector<int>B;// vector存储答案数组
for(auto c:b)//auto循字符串容器
{
if(c!='.') B.push_back(c-'0');//字符串转数字
}
while(n--) mul(B,2);
if(B[dot-1]>=5) add(B,dot);//举例:12.31->1231->1321->132.1->因为小数点已经删除即是小数点位置是2的位置,判断小数点前的一位
for(int i=B.size()-1;i>=dot;i--) cout<<B[i];//逆序输出,存储的时候从0开始,输出的时候从size-1的时候开始
return 0;
}