Проблемы с переводом числа в другую систему счисления и перегрузкой переменной
Делаю программку для решения 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 шт):
В варианте для C# переменная
fимеет типdouble. Постоянные деленияf = f / nбудут продолжаться до тех пор покаfне станет меньше минимального представимого положительного числа. То есть, очень долго. У вас получится много лишних нулей. Смените типfна целый чтобы вернуть правильное поведение.Используйте
BigIntegerдля неограниченных целых.
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();
}
}
}

