Проблемы с переводом числа в другую систему счисления и перегрузкой переменной

Делаю программку для решения 14 задания ЕГЭ по информатике. У меня проблемы с переводом кода с языка Python на C#, а также с перегрузкой переменной при больших входящих значениях

Проблема 1:

Мне нужно перевести число из 10-ой в n-ую систему счисления. Я нашел пример на языке Python, но при переводе его на язык C# возникли проблемы

Задача:введите сюда описание изображения

Код на Python, взятый на одном из уроков по подготовке и подогнанный к этой задаче:

f = 125 + 25**3 + 5**9 // это формула, данная с задачи
a = '0123456789A'
s=''
n = 5

while f>0:
    s += str(a[f%n])
    f = f // 5

print(s.count('0')) 

Мой код на C#:

class Formula
    {
        static double f = 125 + Math.Pow(25,3) + Math.Pow(5,9); // формула данная в задаче

        static char[] symb = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D' }; // Алфавит 
        static int n = 5; // система счисления

        static string s; // итог счета "f" в системе счисления "n"
        public static void sCounter()
        {
            var p = "0";
            while (f > 0)
            {
                s += symb[(int)f % n];
                f = f / n;
            }
            int i = 0, count = 0;
            while ((i = s.IndexOf(p, i)) != -1) { ++count; i += p.Length; } // считаем кол-во определённых символов в строке
            Console.WriteLine(count);
        }
    }

В итоге, строка с числом в нужной системе счисления равна не тому, что должно получится, если я буду использовать Python введите сюда описание изображения

Проблема 2:

Есть задачи, где конечное значение формулы очень большое, из-за чего возникают перегрузки

Например:введите сюда описание изображения

Посоветуйте пожалуйста, как решить такую проблему


Ответы (2 шт):

Автор решения: Stanislav Volodarskiy
  1. В варианте для C# переменная f имеет тип double. Постоянные деления f = f / n будут продолжаться до тех пор пока f не станет меньше минимального представимого положительного числа. То есть, очень долго. У вас получится много лишних нулей. Смените тип f на целый чтобы вернуть правильное поведение.

  2. Используйте BigInteger для неограниченных целых.

→ Ссылка
Автор решения: Vladimir Rodimushkin
using System;
using System.Numerics;         // подключаем для использования BigInteger
namespace ConsoleApp3
{
class Program
{
static void Main()
{
BigInteger resultFormula;      // анализируемое значение (результат вычислений по заданной формуле)            
BigInteger tabValue;           // создание  таблицы степеней основания системы счисления " baseNum"
BigInteger countBit0 = 0;      // инициализация переменной количества значащих нулей 
BigInteger saveBit;            // переменная для записи бита 
int baseNum = 5;               // инициализация основания системы счисления

//  инициализация переменной результатом вычислений по формуле 
resultFormula = (BigInteger.Pow(2, 2020) + BigInteger.Pow(2, 2017));

//  Цикл преобразования значения из десятичной системы в систему счисления с основанием " baseNum"
for (tabValue = resultFormula; tabValue > 0; tabValue /= baseNum)                                      
{
saveBit = tabValue % baseNum;   // определение значения в системе счисления с основанием "baseNum"
if (saveBit == 0) countBit0++;  // счетчик
}            
Console.Write("Количество значащих нулей равно:  " + countBit0+ "\n");
Console.ReadKey();   
}
}
}                
→ Ссылка