问题:
给定整数区间[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;
}