覆盖数字(from pongo)

问题:

给定整数区间[a,b]和整数区间[x,y],你可以使用任意多次a,b之间的整数做加法,可以凑出多少个[x,y]区间内的整数?输入 a,b,x,y,其中1<= a < b <= 1000000000,  1 <= x < y <= 1000000000。 输出: 用[a,b]内的整数做任意多次加法,可以得到多少个[x,y]内的整数。例如a = 8, b = 10, x = 3 , y = 20我们可以得到 [3..20]之间的整数 8, 9, 10, 16 ( 8 + 8), 17(8 + 9), 18(9 + 9), 19(9 + 10), 20(10 + 10),因此输出8。 问:2+3=5 1+4=5 这算1个还是2个?答:算1次 问你能覆盖多少个不同的数字 [x,y]全覆盖住得话 就是y - x + 1。

做法:

代码如下:

int howmany(int a, int b, int x, int y)
{
    int num=0, max_remainder, judge_times;
    int x_times, x_remainder, y_times, y_remainder;
    max_remainder = (b<2*a)? b%a:a-1;
    judge_times = (int)ceil(1.0*(a-1)/max_remainder);
    x_times = x/a;
    y_times = y/a;
    x_remainder = x%a;
    y_remainder = y%a;

    if(x_times>=judge_times && y_times>=judge_times)
    {
        num = y-x+1;
    }
    else 
    {
        if(x_times<judge_times && y_times>=judge_times)
        {
            num = y-a*judge_times+1 + howmany(a,b,x,a*judge_times-1);
        }
        else
        {
            
            if(y_times==x_times)
                num = (x_remainder>x_times*max_remainder)? 0:(((y_remainder<x_times*max_remainder)? y_remainder:x_times*max_remainder)-x_remainder+1);
            else 
            {        
                num = (x_remainder>x_times*max_remainder)? 0:(x_times*max_remainder-x_remainder+1);
                num = num + ((y_remainder<(y_times*max_remainder))? (y_remainder+1):(y_times*max_remainder+1));
                if(y_times>x_times+1)
                    num = num + (y_times-x_times-1)*((x_times+1)*max_remainder+(y_times-1)*max_remainder+2)/2;
            }

        }
    }
    return num;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值