задачка на деление
Как поделить число на группы чисел без остачи?
Например, нужно число 22 поделить на 3 и 4 таким образом, чтоб было максимальное количество групп по 3. Конкретно тут это будет 3*6 + 4*1 Возможно, конечно так вот, но думаю. что можно все проще сделать. Допустим, что у нас есть функция наибольших и наименших общих делителей. Можно это вообще без циклов сделать?
var n = число
var x = число-делитель, групп которого должно быть макс количество
var y = другое число-делитель
var numX, numY -количество групп
var gr3 = 0
var ostacha = n%x
while (ostacha & trig != 0) {
trig = (ostacha + x*i)%x + (ostacha + x*i)%y
i++
}
numY = (x*i)/y
numX = (n-numY)/x
|
Цитата:
Как набросок...
// число
var n = 22;
// число-делитель, групп которого должно быть макс количество
var x = 3;
// другое число-делитель
var y = 4;
// -количество групп
var nX, nY
var k = Math.floor(x / y) + ((x % y) > 0) ? 1: 0;
nX = Math.floor(n / x);
nY = n % x;
nY = Math.floor(nY / y);
if (nY==0) {
nY=1;
nX-=k;
};
alert(nX + '*' + x + '+' + nY + '*' + y);
Но в окончательном варианте условий будет больше... |
Вот вроде подойдет на все 100%... :D
// число
var n = 22;
// число-делитель, групп которого должно быть макс количество
var x = 3;
// другое число-делитель
var y = 4;
// -количество групп
var nX = 0, nY = 0;
if (n > y) {
var k = Math.floor(y / x);
k += ((y % x) > 0) ? 1 : 0;
nX = Math.floor(n / x);
nY = n % x;
if (nY < y ) {
var val = Math.floor((nY + x * (k - 1)) / y);
nX -= k - val;
nX = (nX < 0) ? 0 : nX;
} else {
nY = Math.floor(nY / y);
};
}
alert(nX + '*' + x + '+' + nY + '*' + y);
|
хм. хотя не всегда срабатывает. И можно немного комментариев, пожалуйста. Что это за k и val
// число
var n = 678867;
// число-делитель, групп которого должно быть макс количество
var x = 767;
// другое число-делитель
var y = 6776;
// -количество групп
var nX = 0, nY = 0;
if (n > y) {
var k = Math.floor(y / x);
k += ((y % x) > 0) ? 1 : 0;
nX = Math.floor(n / x);
nY = n % x;
if (nY < y ) {
var val = Math.floor((nY + x * (k - 1)) / y);
nX -= k - val;
nX = (nX < 0) ? 0 : nX;
} else {
nY = Math.floor(к / y);
};
}
alert(nX + '*' + x + '+' + nY + '*' + y + ' -- '+ (nX*x+nY*y));
|
PashPP,
Где то по форуму был код от Дзен-Нагуалист с поиском наименьших общих делителей, далее ток разбить на нужное число слагаемых |
Deff,
А что это даст? Допустим, эта функция у нас есть. |
Цитата:
Цитата:
val - коррекция "k", если остаток достаточно большей и "k" можно уменьшить на 1. |
Цитата:
// число
var n = 678867;
// число-делитель, групп которого должно быть макс количество
var x = 767;
// другое число-делитель
var y = 6776;
// -количество групп
var nX = 0, nY = 0;
if (n > y) {
var k = Math.floor(y / x);
k += ((y % x) > 0) ? 1 : 0;
nX = Math.floor(n / x);
nY = n % x;
if (nY < y ) {
var val = Math.floor((nY + x * (k - 1)) / y);
nX -= k - val;
nY=1;
if (nX < 0) {
nX=0;
nY=0;
};
} else {
nY = Math.floor(nY / y);
};
}
alert(nX + '*' + x + '+' + nY + '*' + y);
|
| Часовой пояс GMT +3, время: 21:05. |