Как избавиться от переполнения?
где-то читал, что переполнения беззнаковых целых быть не должно.
Нет никакой магии в беззнаковых целых, максимальное представимое число -- 2^(количество бит)-1, от больших чисел остаётся остаток по модулю 2^(количество бит). Это поведение описано стандартами языка C.
Использовать специальные библиотеки для больших чисел. А в вашей программе никак не избавиться.
Вычисления делаются через Double, у него есть ограничение на точность по мантиссе. Потом переводите в uint - все что в мантиссу не влезло превратилось в нули.