数分?分数!

题目描述

在被数分课完虐之后LazyChild决定去研究分数。他发现一件很有爱的事情,很多分数的小数形式四舍五入到某一位后都是一样的。比如四舍五入到千分位之后等于0.500的有12,5001000,甚至还有6001201,2893257869 等。LazyChild现在给你一个四舍五入到某一位的小数v(不超过7位),他要你找出有多少个分数的小数形式四舍五入到这一位等于给定的v。为了让这个任务能够完成,LazyChild规定分子和分母都是不超过1000000000的正整数。

输入格式

一行一个正实数v(0 <v< 1)小数点后有n位(1 ≤n≤7)

输出格式

一个整数表示分子和分母不超过1000000000的分数四舍五入到小数点后n位等于v的分数的个数。

样例输入

0.5000000

样例输出

50000000050 

【解析】

这个题对模型的抽象能力要求比较高。
考虑0.5这个数(注:和样例本质不同),满足条件的数的区间就是[0.45,0.55),即0.45<=y/x<0.55(x,y<=10^9)。放到坐标系里根据条件画出可行域,则可行域内所有整点即为所求。具体方法拿图说话比较好一点,明天再弄,先贴代码。

const
        d=1000000000;
var
        v:real;
        a,l,r:longint;
        ans:int64;
        s:string;

function gcd(i,j:longint):longint;
begin
        if i mod j = 0 then exit(j);
        exit(gcd(j,i mod j));
end;

function getmatrix(y:longint):int64;
var
        i,j:longint;
        m,sum:int64;
begin
        m:=gcd(d,y)+1;
        sum:=y;
        for i:=1 to 9 do
                sum:=sum*10;
        sum:=sum+d+y+1-m;
        sum:=sum div 2;
        exit(sum);
end;

procedure change;
var
        t:string;
        i,j,len:longint;
        b:int64;
begin
        len:=length(s)-pos('.',s);
        t:=copy(s,pos('.',s)+1,len);
        val(t,a);
        j:=1;
        for i:=1 to 9-len do
                j:=j*10;
        a:=a*j;
        j:=1;
        for i:=1 to 8-len do
                j:=j*10;
        l:=a-5*j;
        r:=a+5*j;
        //writeln(l);writeln(r);
end;

begin
        readln(s);
        change;
        ans:=getmatrix(r)-getmatrix(l);
        writeln(ans);
end.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值