链接:https://acm.ecnu.edu.cn/contest/73/problem/A/
几乎每个学 C 语言的人都会面临这样一种困惑:为什么 % 只支持整数和整数,不支持浮点数。自然,C++ 提供了运算符重载几乎可以很方便地实现自定义的浮点数模运算,但到底是不方便的。
而与此相对比的,Java / Python 等高级语言就直接支持了浮点数模运算。
本题就是:给两个浮点数 a, b,求 amodb。
然后你会发现,事情并不简单。
Input
一行两个浮点数 a, b (0< a,b≤109),a, b 保证保留到小数点后第九位。
Output
输出浮点数,相对误差或绝对误差不超过 10−15。
假设你的答案是 a,标准答案是 b,你的答案正确当且仅当 |a−b|max(1,|b|)<10−15。
Examples
input
3.000000000 2.000000000
output
1.000000000
input
0.400000000 0.200000000
output
0
思路:把两个浮点数a,b扩大倍数转换成整型(long long 存储),然后用整型进行取模,然后再缩小倍数输出。
注意::输入a,b时不要用double来存储,会有精度损失,可以用字符串输入,或者用
long double 来输入。
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#define ll long long
using namespace std;
char str1[100],str2[100];
ll ans[1000];
ll s1,s2,s3;
ll Pow(ll n)
{
ll sum=1;
for(int i=0;i<n;i++)
{
sum*=10;
}
return sum;
}
ll tran(char str[])
{
ll l=strlen(str);
ll s=0;
for(int i=0;i<l-10;i++)
{
s+=(str[i]-'0')*Pow(l-10-i-1);
}
s=s*1e9;
ll b=8;
for(int i=l-9;i<l;i++)
{
s+=(str[i]-'0')*Pow(b);
b--;
}
return s;
}
int main()
{
scanf("%s",str1);
s1=tran(str1);
scanf("%s",str2);
s2=tran(str2);
s3=s1%s2;
ll ant=1,flag=0;
while(s3)
{
ans[ant]=s3%10;
if(ans[ant])
flag=1;
ant++;
s3=s3/10;
}
ant=ant-1;
if(flag==0)
printf("0\n");
else
{
if(ant<=9)
{
printf("0.");
int a=9-ant;
for(int i=1;i<=a;i++)
printf("0");
for(int i=ant;i>=1;i--)
printf("%lld",ans[i]);
printf("\n");
}
else
{
for(int i=ant;i>9;i--)
printf("%lld",ans[i]);
printf(".");
for(int i=9;i>=1;i--)
printf("%lld",ans[i]);
printf("\n");
}
}
return 0;
}
`