9.26上机课,爆double的一题

给定浮点数a,b(保证输入有小数点,保证小数点后有9位数字),输出浮点数a*b,精确到小数点后9位。
0.000000000<=a,b<=99999999.999999999
看看就知道99999999.999999999超double范围了,这里采用字符串输入,也可以用 int+char+int输入方式,’.'看作char
(其实有long double,比double还大一点点,但也不够)

#include<iostream>
#include<string>
using namespace std;
string s1,s2;
int f1,f2;
long long a=0,b=0,c=0,d=0,ans1=0,ans2=0;

int main(){
	cin>>s1>>s2;
	for(int i=1;i<=s1.length() ;i++){
		f1 = i-1;
		if(s1[i-1]=='.') break;
		a = a*10+s1[i-1]-'0';
//		cout<<s1[i-1]-'0'<<endl;
	}
//	cout<<a<<endl;
	for(int i=1;i<=s2.length() ;i++){
		f2 = i-1;
		if(s2[i-1]=='.') break;
		b = b*10+s2[i-1]-'0';
	}
//	cout<<b<<endl; 
	for(int i=f1+2;i<=s1.length() ;i++){
		c = c*10+s1[i-1]-'0';
	}
//	cout<<c<<endl;
	for(int i=f2+2;i<=s2.length() ;i++){
		d = d*10+s2[i-1]-'0';
	}
//	cout<<d<<endl;
	ans1 = a*b;
//	cout<<ans1<<endl;
	ans1 = ans1+(a*d)/1000000000;
	ans1 = ans1+(c*b)/1000000000;
	ans2 = (a*d)%1000000000+(c*b)%1000000000
			+(c*d+500000000)/1000000000;
//注意位数是固定了的,所以放心除
//	注意这里加了500000000!!!!!是要进位的你的小数!!! 

//	cout<<b<<" "<<d<<" "<<b*d<<endl;
//	cout<< (a*d)%1000000000<<" "<<(c*b)%1000000000<<" "<<(b*d)/1000000000<<endl;
//	cout<<ans2<<endl;
	ans1 += ans2/1000000000;
//	ans2 += 500000000;
	ans2 %= 1000000000;
	cout<<ans1<<'.';
	printf("%09lld",ans2);
	return 0;
} 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值