Всего – то нужно было сложить пару длинных чисел… 🙂
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
class BigInteger32 { public List<Int32> number = new List<Int32> (); public BigInteger32 SmartAdd ( BigInteger32 operand ) { Int32 mask = 1 << 31; Int32 hypo_length = Math.Max ( number.Count, operand.number.Count ); Int32 intermediate_left_operand; Int32 intermediate_right_operand; Int32 intermediate_result; Int32 move_to_next = 0; for ( int i = 0; i < hypo_length; i++ ) { if ( i < number.Count ) { intermediate_left_operand = number [i]; } else { intermediate_left_operand = 0; number.Add(0); } if ( i < operand.number.Count ) { intermediate_right_operand = operand.number [i]; } else { intermediate_right_operand = 0; } intermediate_result = ~mask & intermediate_left_operand + ~mask & intermediate_right_operand + move_to_next; move_to_next = mask & intermediate_left_operand >> 31 + mask & intermediate_right_operand >> 31 + mask & intermediate_result >> 31; number [i] = (intermediate_result & ~mask) | ((move_to_next & 1) << 31); move_to_next >>= 1; } if ( move_to_next > 0 ) { number.Add ( move_to_next ); } return this; } } |