题目描述 Description
这个难度是吸引你点进来的。(其实难度挺大)
保留小数 的加强版。加强了数据和描述。
有一个实数,要求保留k位小数。请输出结果。
输入描述 Input Description
两行。
第一行,要保留的数;
第二行,k
输出描述 Output Description
输出保留小数的结果。(四舍五入)
样例输入 Sample Input
(样例1)
8
2
(样例2)
7.03
1
(样例3)
7.0003
0
(样例4)
9.9
-1
(样例5)
0.99
3
(样例6)
-9999.2
0
样例输出 Sample Output
(样例1)8.00
(样例2)7.0
(样例3)7
(样例4)10
(样例5)0.990
(样例6)-9999
数据范围及提示 Data Size & Hint
k在longlong范围内;
要保留的小数在10000位以内。
如果k为负数,则向前保留。
要保留的小数可以为负数。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char a[1000000],b[1000000];
int main()
{
long long n,i,k,k2,r=1,r2=0;
scanf("%s%lld",a,&n);
if(a[0]=='-') r2=1;
for(i=0;i<strlen(a);i++) {if(a[i]=='.'){r=0;break;}}
k=i;
if(n<=0)
{
if(a[k+n]>='5'||(a[k+n]=='.'&&a[k+n+1]>='5'))
{
k2=1;
for(i=k+n-1;i>=0;i--)
{
if(a[i]=='.') continue;
if(a[i]=='-')break;
b[i]=a[i]+k2;
a[i]=(a[i]-48+k2)%10+48;
k2=(b[i]-48)/10;
}
if(k2==1)
{
if(r2==1)printf("-1");
else printf("1");
}
for(i=0;i<k;i++)
{
if(k2==1&&a[0]=='-'&&i==0)continue;
if(i>=k+n) printf("0");
else if(a[i]!='.'&&(a[i]<'0'||a[i]>'9')&&a[i]!='-')printf("0");
else printf("%c",a[i]);
}
}
else for(i=0;i<k;i++) {if(i>=k+n) printf("0");else printf("%c",a[i]);}
return 0;
}
if(r==1)
{
printf("%s.",a);
for(i=1;i<=n;i++) printf("0");
return 0;
}
if(a[k+n+1]<'5')
{
for(i=0;i<=k+n;i++) {if(k2==1&&a[0]=='-'&&i==0)continue;if(a[i]!='.'&&(a[i]<'0'||a[i]>'9')&&a[i]!='-')printf("0");else printf("%c",a[i]);}
}
else
{
if(a[k+n]<'9') a[k+n]++;
else if(a[k+n]=='9')
{
k2=1;
for(i=k+n;i>=0;i--)
{
if(a[i]=='.') continue;
if(a[i]=='-')break;
b[i]=a[i]+k2;
a[i]=(a[i]-48+k2)%10+48;
k2=(b[i]-48)/10;
}
if(k2==1)
{
if(r2==1)printf("-1");
else printf("1");
}
}
for(i=0;i<=k+n;i++)
{
if(k2==1&&a[0]=='-'&&i==0)continue;
if(a[i]!='.'&&(a[i]<'0'||a[i]>'9')&&a[i]!='-')printf("0");
else printf("%c",a[i]);
}
}
return 0;
}