задачка на деление
Как поделить число на группы чисел без остачи?
Например, нужно число 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, время: 07:15. |