(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦
目录
题意:传送门
原题目描述在最下面。
给你一个大数字,问你小数点后最多进位m次能得到的最大数字是多少?
思路:
找到第一个能进位的地方。然后判断一下前面有多少个4,因为4还能再进位。然后再判断一下前面有多少个9。最后判断一下如果进位到小数点前面去了,然后小数点前一位是9这个情况。
基本上差不多了。原谅我码力太差,写的这么冗长。
AC代码:
#pragma comment(linker,"/STACK:102400000,102400000")
#include <bits/stdc++.h>
#define mme(a,b) memset((a),(b),sizeof((a)))
#define fuck(x) cout<<"* "<<x<<"\n"
#define iis std::ios::sync_with_stdio(false)
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;
const int INF = 0x3f3f3f3f;
const int mod = 998244353;
const double eps = 1e-8;
const int N = 2e5 + 7;
const int MX = 1e5 + 7;
const uLL base = 131;
int n, m, k,la;
char ar[N],br[N],cr[N];
void hhh(){
if(cr[0]=='9'){
cr[0]++;
for(int i=0;i<la;++i){
if(cr[i]>'9'){
cr[i]='0';
++cr[i+1];
if(i==la-1){
cr[i+1]='1';
++la;
}
}
}
cr[la]='\0';
for(int i=0;i<la;++i){
br[i] = cr[la-1-i];
}
printf("%s\n", br);
}else{
br[la-1]++;
printf("%s\n", br);
}
}
int main(){
int tim,tc = 0;
//scanf("%d", &tim);
while(~scanf("%d%d",&n,&m)){
int a=0;
memset(ar,0,sizeof(ar));
memset(br,0,sizeof(br));
scanf("%s",cr);
int len = strlen(cr);
for(a=0;a<len;++a){
if(cr[a]=='.')break;
br[a]=cr[a];
}
la=a++;
for(int i=0;a<len;++a,++i){
ar[i]=cr[a];
}
len = len - la-1;
br[la]='\0';ar[len]='\0';
int p=-1,four=0;
memset(cr,0,sizeof(cr));
for(int i=0;i<la;++i){
cr[i] = br[la-1-i];
}
for(int i=0;i<len;++i){
if(ar[i]>='5'){
p=i;break;
}
}
for(int i=p-1;i>=0;--i){
if(ar[i]=='4')four++;
else break;
}
if(p==-1){
printf("%s.%s\n", br,ar);
}else{
if(p==0){
hhh();
}else{
int qianJing = min(m,four+1);
if(qianJing>p){
hhh();
continue;
}
if(ar[p-qianJing]=='9'){
int t = p-qianJing;
while(t&&ar[t]=='9'){
--t;
}
if(t=-1){
hhh();
}else{
ar[t]++;
ar[t+1]='\0';
printf("%s.%s\n", br,ar);
}
}else{
ar[p-qianJing]=ar[p-qianJing]+1;
ar[p-qianJing+1]='\0';
printf("%s.%s\n", br,ar);
}
}
}
}
return 0;
}