Алгоритм разбиения целого числа на n "равных долей"
От: stiks  
Дата: 19.06.06 05:41
Оценка:
На входе число, количество частей на которое это число делится, номер части, кол. знаков после запятой
т.е. допустим нужно 7 разделить на 5 частей, кол знаков после запятой = 0
разбиение
1 1
1 2
1 или 1
2 2
2 1
порядок не существенен
те по номеру части например по 3 выдавал ее значение 1 (2)
Re: Алгоритм разбиения целого числа на n "равных долей"
От: Кодт Россия  
Дата: 19.06.06 09:33
Оценка:
Здравствуйте, stiks, Вы писали:

S>На входе число, количество частей на которое это число делится, номер части, кол. знаков после запятой

S>т.е. допустим нужно 7 разделить на 5 частей, кол знаков после запятой = 0

n = kd+r, или k=n/d, r=n%d
Нужно раскидать 0<=r<d единиц по d.

Если не стоит требование равномерности, то так: в первые r частей включаем единицы, а в остальные — не включаем.
unsigned part(unsigned n, unsigned d, unsigned i) // i - номер части, нумерация с нуля
{ return n/d + (i < n%d); }


А если нужно равномерно — это алгоритм Брезенхема для прямых.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Перекуём баги на фичи!
Re: Алгоритм разбиения целого числа на n "равных долей"
От: _DAle_ Беларусь  
Дата: 19.06.06 09:40
Оценка:
Здравствуйте, stiks, Вы писали:

S>На входе число, количество частей на которое это число делится, номер части, кол. знаков после запятой

S>т.е. допустим нужно 7 разделить на 5 частей, кол знаков после запятой = 0
S>разбиение
S>1 1
S>1 2
S>1 или 1
S>2 2
S>2 1
S>порядок не существенен
S>те по номеру части например по 3 выдавал ее значение 1 (2)

Если оба числа целые, то:
Пусть количество знаков после запятой = k.
f(i) = ((Number*10^k) div PartsNum + int(Number*10^k mod PartsNum >= i)) / 10^k

То есть пусть надо 25 разделить на 6 частей с 2 знаками после запятой, получаем
f(1) = (25*100 div 6 + int(25*100 mod 6 > 1)) / 100 = (416 + int(4 >= 1)) / 100 = 4.17
f(2) = 4.17
f(3) = 4.17
f(4) = 4.17
f(5) = 4.16
f(6) = 4.16
Re: Алгоритм разбиения целого числа на n "равных долей"
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 22.06.06 12:17
Оценка:
Здравствуйте, stiks, Вы писали:

S>На входе число, количество частей на которое это число делится, номер части, кол. знаков после запятой

S>т.е. допустим нужно 7 разделить на 5 частей, кол знаков после запятой = 0
S>разбиение
S>1 1
S>1 2
S>1 или 1
S>2 2
S>2 1
S>порядок не существенен
S>те по номеру части например по 3 выдавал ее значение 1 (2)

Может так:

void func (int number_in, int parts, int fract_in)
{
    int fract = fract_in * 10;
    int number = number_in * fract;

    for (int n = 0; n < parts; n++)
    {
        int start = number * n / parts;
        int end = number * (n + 1) / parts;

        int range_int = (end - start) / fract;
        int range_fract = (end - start) % fract;
 
        // Output range_int.range_fract
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.