2011-02-07 2 views
0

У меня есть непрерывная упорядоченная последовательность целых чисел, начинающихся меньше нуля и выше нуля; например, ...,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7. Мне нужно сопоставить их с повторяющейся последовательностью 3,6,9,12, с начальным условием f(0)=3. Так, например, f(-2)=9, f(-1)=12, f(0)=3, f(1)=6, f(2)=9, f(3)=12, f(4)=3 и так далее. Существует ли компактный способ выражения этой операции в Java, так что мы можем просто использовать оператор остатка (%) и избегать любых операторов if/else?Последовательность целых чисел в повторяющейся последовательности

+0

звучит как домашнее задание для меня. это? –

+0

Шон: Нет, просто что-то мне нужно сделать в приложении с математикой по дате. – Abiel

ответ

1

Я хотел бы предложить следующее обрабатывать отрицательный номера.

public int f(int n, int ... sequence) { 
    int idx = n % sequence.length; 
    if (idx < 0) idx += sequence.length; 
    return sequence[idx]; 
} 


int x = f(n, 3,6,9,12); 

однако в данном конкретном примере, есть гораздо более простое решение;)

public int f(int n) { 
    return (n & 3) * 3 + 3; 
} 
+0

Спасибо, мне нравится очень простое решение в конце, и оно работает для обоих положительные и отрицательные числа. – Abiel

+0

Я подозреваю, что три 3-го типа - это ожидаемое решение. –

1
int repeatingSequence[] = { 3,6,9,12 }; 
int fZero = 0; 
int len = repeatingSequence.length; 

public int f(int n) { 
    return repeatingSequence[ (n % len + fZero + len) % len ]; 
} 

Работы для положительных, отрицательных и любых fZero в качестве исходного условия отображения.

+0

Можете ли вы привести пример того, когда fZero не может быть 0? Если это 0, не может ли выражение быть короче? –

+0

Это, похоже, не работает с отрицательными целыми числами. – Abiel

+0

@ Peter, начальное условие отображения произвольно. 'fZero = 0;' имеет место в вопросе OP, который отображает '{0-> 3, 1-> 6, 2-> 9, 3-> 12, 4-> 3, ...}', ' fZero = 1; 'производит смещение 1, поэтому отображение выглядит так: {0-> 6, 1-> 9, 2-> 12, 3-> 3, 4-> 6, ...}' – davin

2

Это будет сервер вашей цели:

int repeatInt = 12 - ((11 - seqInt)*3) % 12 ; 

where repeatInt = 3,9,6 or 12, the output 
    and seqInt = a number from your sequence 

(простите за любые синтаксические ошибки, я попробовал код в PHP, и изменил его на Java)

+0

Большое спасибо, это работает правильно и компактно. – Abiel

+0

DhruvPathak - При ближайшем рассмотрении эта функция не работает, когда seqInt> = 12. Затем она дает повторяющуюся последовательность 12, 15, 18, 21. – Abiel

Смежные вопросы