EOJ Monthly 2018.5 (校赛网络同步赛) A. 浮点数模运算

链接: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;
}

`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值