Существует ли общий способ вычисления значений компонентов, таких как год + месяц + день по дням или мили + ярды + футы + дюймы из дюймов? - PullRequest
0 голосов
/ 06 августа 2009

Я знаю, что должен быть общий метод, но я даже не знаю термин для поиска, и я не хочу сильно изобретать колесо.

' Значения отдельных компонентов ' и ' составные значения ' не дают хороших результатов.

другой пример : градусы + минуты + секунды от секунд дуги или тонны + фунты + унции от унций.

Я работаю в C, но это не должно быть слишком трудно переводить с другого языка.

Входными данными будет базовое значение, скажем, общее число дюймов = 9534567, и деление на единицы, например, футы = 12, ярды = футы * 3, мили = ярды * 1760 Вывод будет 150 миль, 849 ярдов, 0 футов и 3 дюйма.

Конечно, это можно обобщить, чтобы использовать какой-то другой набор подразделений. И целая библиотека кажется излишней, не правда ли?

Ответы [ 5 ]

1 голос
/ 06 августа 2009

Как уже упоминалось, это сложнее при работе с нестандартными длинами промежуточных элементов. Однако, учитывая стандартный набор перерывов, вы можете вычислить, используя следующее:

void components (long value, long * parts, int parts_sz, long * result) {

    int i = 0;
    for (; i < parts_sz; ++i) {
        result[i] = value / parts[i];
        value %= parts[i];
    }
}

int main () {

    int i = 0;
    long parts[] = {10000, 1000,100,10,1}, result[] = {0,0,0,0,0};
    long value = 99853;

    components (value, parts, 5, result);

    for (; i < 5; ++i)
        printf ("There were %ld %lds\n", result[i], parts[i]);

    retrun 0;
}

Что дает:

There were 9 10000s
There were 9 1000s
There were 8 100s
There were 5 10s
There were 3 1s
1 голос
/ 06 августа 2009

В большинстве случаев вычисления довольно просты, хотя кодирование всех коэффициентов преобразования может быть утомительным.

Однако вычисления с использованием длительности являются концептуально сложными. Сколько дней в году? Это 365 ... или 366? Сколько секунд в году?

1 голос
/ 06 августа 2009

Не существует универсального способа для каждого составного значения. Каждый из приведенных вами примеров довольно радикально отличается в «разделениях» для каждого. Конечно, худшие из-за разницы в продолжительности месяцев и т. Д.

Что касается остальных, вы, вероятно, могли бы что-то сделать по-другому, предоставив список «отсечек» для каждого значения и получив список каждого из них. Тогда у вас есть только модули и операции деления, чтобы разделить значение.

0 голосов
/ 06 августа 2009

Математическое преобразование между единицами просто включает один или два шага процесса деления или умножения в зависимости от того, как вы переходите между единицами. Простым примером является логарифмическая шкала метрической системы: Чтобы перейти от метров к сантиметрам, нужно умножить на 100, потому что в метре 100 сантиметров.

Я не знаю никакого C, но все, что вам действительно нужно знать, это коэффициент пересчета и то, повышаетесь или понижаетесь вы в единице величины. Это должно работать для хорошо спроектированных систем, таких как метрическая система, где все идет в логарифмическом масштабе, но где коэффициенты преобразования отличаются, как в имперской системе, с которой вы столкнетесь, если попытаетесь конвертировать с одним фактором. Вы можете просто сделать так, чтобы ваша программа рекурсивно поднималась или опускалась на разные единицы. Так что вы можете пойти:

Metres  (n*100)-> cm (cm*10) -> mm (mm*1000) -> µm 

И тогда деление будет происходить только в обратном порядке, сохраняя коэффициенты преобразования одинаковыми.

Мораль истории: не используйте имперскую систему.

0 голосов
/ 06 августа 2009

Математически это целочисленное деление с остатком.

В C (и Java, ...) вы можете использовать операторы / и% для вычисления соотношения и остатка соответственно.

Edit:

1249559005844: "6. August 2009 11:43:25 UTC"
1249559005844 % 1000 = 844
1249559005844 / 1000 = 1249559005
1249559005 % 60 = 25
1249559005 / 60 = 20825983
20825983 % 60 = 43
20825983 / 60 = 347099
347099 % 24 = 11
347099 / 24 = 14462

Над днями становится грязно, потому что месяцы и годы имеют разную длину.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...