wikioi 2988 保留小数2


题目描述 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;	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值