模拟题还是写少了 这题写了个半死
花了一个小时才写完
题目思路
题目要求模拟一个四舍五入的过程 并且给了一个四舍五入的次数t
但其实对题目没有太多的关系
因为我们只需要记录小数点后最前面的那个大于四做四舍五入就好了
对这个点做四舍五入一定优于对后面的点做四舍五入
所以先记录小数点后第一个大于四的位置
然后对小数点后的位置做操作
因为我们记录的是第一个大于四的位置
所以我们对小数点后数位做操作时 不需要考虑进位的问题
如果该操作对小数点前的数有影响再考虑是否会进位
大概思路就是这样 主要还是自己去模拟这个过程
ac代码
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <utility>
#define pi 3.1415926535898
#define ll long long
#define lson rt<<1
#define rson rt<<1|1
#define eps 1e-6
#define ms(a,b) memset(a,b,sizeof(a))
#define legal(a,b) a&b
#define print1 printf("111\n")
using namespace std;
const int maxn = 1e7+10;
const int inf = 0x3f3f3f3f;
const ll llinf =0x3f3f3f3f3f3f3f3f;
const int mod = 1e9+7;
int n,t;
char a[maxn];
int main()
{
scanf("%d%d",&n,&t);
scanf("%s",a);
int flag=0,index=-1;
for(int i=0;i<n;i++)
{
if(a[i]=='.'&&flag==0)
{
flag=i;//记录小数点的位置
}else if(flag!=0)
{
if(a[i]>='5')
{
index=i;//记录小数点后第一个大于四的位置
break;
}
}
}
int flag2=0;
while(index>flag)//对小数点后位置进行操作
{
if(index!=flag+1)
{
if(a[index]>='5')
{
a[index-1]++;
t--;
}
}else
{
if(a[index]>='5')
{
index=flag-1;
flag2=1;
break;
}
}
index--;
if(t<=0||a[index]<'5')break;
}
if(flag2==1)
{
for(int i=index;i>=0;i--)
{
if(flag2==1)
{
a[i]++;flag2=0;
if(a[i]>'9')
{
a[i]='0';
flag2=1;
}
}else
break;
}
}
if(flag2==1)
printf("1");
if(index!=-1)
{
for(int i=0;i<=index;i++)
printf("%c",a[i]);
printf("\n");
}else
{
printf("%s\n",a);
}
}