博客主页:PH_modest的博客主页
当前专栏:每日一题
其他专栏:
每日反刍
C++跬步积累
C语言跬步积累
座右铭:广积粮,缓称王!
B - Broken Rounding(AtCoder Beginner Contest 273)
判断第k个数字是大于4还是小于4,判断方法就是取模,得到k以及之后的数字,将其与4pow(10,k-1)或5pow(10,k-1)进行比较,如果大于四往前进一,小于四就把后面的全置为0,具体方法就是用那个数除以pow(10,k),就得到了前面的数字,如果需要进一,就将其加上1再乘上pow(10,k),反之亦然。但如果第k个数等于4就继续往后判断,方法和上面一致,思路可能不是很难,但过程有点繁琐。
虽然说我这个方法不是很好,但是写完我也发现了几个重要的点:
- pow函数返回值是double,取模时需要强制类型转换
- 如果用cout输出的数字较大时,需要用一个变量存起来再输出,否则输出时会帮你简写成类似1e14+014的形式。
//cout输出大的数字需要存起来再输出
//pow返回值是double,%时需要强制类型转换
//
#include
#include
#include
#include
#include
#define int long long
using namespace std;
void solve()
{
int x,n;
cin>>x>>n;
int tmp=x;
int couts=0;
while(tmp)
{
tmp/=10;
couts++;
}
if(couts<n)
{
cout<<"0"<<"\n";
return;
}
if(x%(int)pow(10,(int)n)<4*pow(10,(int)n-1))
{
int ans=x/(int)pow(10,n)*pow(10,n);
cout<<ans<<"\n";
return;
}
else if(x%(int)pow(10,(int)n)>=5*pow(10,(int)n-1))
{
int ans=(x/(int)pow(10,n)+1)*pow(10,n);
cout<<ans<<"\n";
return;
}
else
{
if(n==1)
{
if(x%10>=5)
{
cout<<(x/10+1)*10;
return;
}
if(x%10<5)
{
cout<<x/10*10;
return;
}
}
else
{
for(int i=1;i<n;i++)
{
if(x%(int)pow(10,(int)n-i)<4*(int)pow(10,(int)n-(i+1)))
{
int ans=x/(int)pow(10,(int)n)*(int)pow(10,(int)n);
cout<<ans<<"\n";
return;
}
else if(x%(int)pow(10,(int)n-i)>=5*pow(10,(int)n-(i+1)))
{
int ans=(x/(int)pow(10,(int)n)+1)*(int)pow(10,(int)n);
cout<<ans<<"\n";
return;
}
else
{
continue;
}
}
int ans=x/(int)pow(10,(int)n)*(int)pow(10,(int)n);
cout<<ans<<"\n";
return;
}
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie();
cout.tie();
solve();
return 0;
}
每日一题系列旨在养成刷题的习惯,所以对代码的解释并不会特别详细,但足够引导大家写出来,选的题目都不会特别难,但也不是特别简单,比较考验大家的基础和应用能力,我希望能够将这个系列一直写下去,也希望大家能够和我一起坚持每天写代码。
之后每个星期都会不定期更新codeforces和atcoder上的题目,想要学习算法的友友们千万别错过了,有什么疑问欢迎大家在评论区留言!
在这里送大家一句话:广积粮,缓称王!