Какова сумма цифр числа 2^1000?
Это
10 ответов
нормальный int
не могу помочь вам с таким большим количеством. Даже long
. Они никогда не были предназначены для обработки таких огромных чисел. int
может хранить около 10 цифр (точных Макс: 2,147,483,647
) и long
для около 19 цифр (точный Макс:9,223,372,036,854,775,807
). Однако быстрый расчет из встроенного калькулятора Windows говорит мне 2^1000
является числом более 300 цифр.
(Примечание: точное значение может быть получено из int.MAX_VALUE
и long.MAX_VALUE
соответственно)
как вы хотите точную сумму цифр, даже float
или double
типы не будут работать, потому что они хранят только значимые цифры для нескольких десятков цифр. (7
цифра для float,15-16
цифры для double). читать здесь для получения дополнительной информации о представлении с плавающей точкой, двойной точности
однако C# предоставляет встроенную арифметику
BigInteger
для произвольного точность, которая должна соответствовать вашим (испытывая) потребностям. т. е. может делать арифметику в любом количестве цифр (теоретически, конечно. На практике он действительно ограничен памятью вашей физической машины и занимает время в зависимости от мощности вашего процессора)
вернемся к вашему коду, я думаю, что проблема здесь
Math.Pow(2, powerOfTwo)
это переполняет расчет. Ну, не совсем, но это double
точность точно не представляет фактическое значение результат, как я уже сказал.
для вычисления значений таких больших чисел вам нужно быть не только хорошим программистом, но и хорошим математиком. Вот подсказка для вас, есть знакомая формула ax = ex ln a , или, если хотите, ax = 10X log a.
более конкретно к вашей проблеме 21000 найдите общий (базовый 10) журнал 2 и умножьте его на 1000; это сила 10. Если вы получите что-то вроде 1053.142 (53.142 = log 2 value * 1000) - что вы, скорее всего, будете-тогда это 1053 x 100.142; просто оцените 100.142 и вы получите число от 1 до 10; и умножьте это на 1053, но это 1053 не будет полезно, Так как 53 нулевая сумма будет равна нулю.
для расчета журнала в C#
Math.Log(num, base);
Для больше точности вы можете использовать, журнал и функция Pow большого Целое число.
теперь помощь программирования остальных я считаю, что вы можете иметь с вашей стороны.
решение без использования класса BigInteger-хранить каждую цифру в собственном int, а затем выполнять умножение вручную.
static void Problem16()
{
int[] digits = new int[350];
//we're doing multiplication so start with a value of 1
digits[0] = 1;
//2^1000 so we'll be multiplying 1000 times
for (int i = 0; i < 1000; i++)
{
//run down the entire array multiplying each digit by 2
for (int j = digits.Length - 2; j >= 0; j--)
{
//multiply
digits[j] *= 2;
//carry
digits[j + 1] += digits[j] / 10;
//reduce
digits[j] %= 10;
}
}
//now just collect the result
long result = 0;
for (int i = 0; i < digits.Length; i++)
{
result += digits[i];
}
Console.WriteLine(result);
Console.ReadKey();
}
я использовал побитовое смещение влево. Затем преобразование в массив и суммирование его элементов. Мой конечный результат 1366, не забудьте добавить ссылку на System.Числительные;
BigInteger i = 1;
i = i << 1000;
char[] myBigInt = i.ToString().ToCharArray();
long sum = long.Parse(myBigInt[0].ToString());
for (int a = 0; a < myBigInt.Length - 1; a++)
{
sum += long.Parse(myBigInt[a + 1].ToString());
}
Console.WriteLine(sum);
поскольку вопрос специфичен для c#, используя bigInt, может выполнить эту работу. в java и python тоже работает, но на таких языках, как c и C++, где объект недоступен, вы должны взять массив и сделать умножение. возьмите большую цифру в массиве и умножьте ее на 2. это было бы просто и поможет в улучшении вашего логического навыка. и пришел к проекту Эйлера. есть проблема, в которой вы должны найти 100! возможно, вы захотите применить ту же логику и к этому.
попробуйте использовать BigInteger type
, 2^100 в конечном итоге будет очень большое число для даже двойной обработки.
BigInteger bi= new BigInteger("2");
bi=bi.pow(1000);
// System.out.println("Val:"+bi.toString());
String stringArr[]=bi.toString().split("");
int sum=0;
for (String string : stringArr)
{ if(!string.isEmpty()) sum+=Integer.parseInt(string); }
System.out.println("Sum:"+sum);
------------------------------------------------------------------------
output :=> Sum:1366
Это не серьезный ответ-просто наблюдение.
хотя это хорошая задача, чтобы попытаться победить Project Euler, используя только один язык программирования,я считаю, что сайт направлен на дальнейшее горизонты всех программистов, которые пытаются его. Другими словами, рассмотрите возможность использования другого языка программирования.
Обычный Lisp решение к проблеме может быть так же просто, как
(defun sum_digits (x)
(if (= x 0)
0
(+ (mod x 10) (sum_digits (truncate (/ x 10))))))
(print (sum_digits (expt 2 1000)))
main()
{
char c[60];
int k=0;
while(k<=59)
{
c[k]='0';
k++;
}
c[59]='2';
int n=1;
while(n<=999)
{
k=0;
while(k<=59)
{
c[k]=(c[k]*2)-48;
k++;
}
k=0;
while(k<=59)
{
if(c[k]>57){ c[k-1]+=1;c[k]-=10; }
k++;
}
if(c[0]>57)
{
k=0;
while(k<=59)
{
c[k]=c[k]/2;
k++;
}
printf("%s",c);
exit(0);
}
n++;
}
printf("%s",c);
}
Python упрощает вычисление этого с помощью oneliner:
print sum(int(digit) for digit in str(2**1000))
или альтернативно с картой:
print sum(map(int,str(2**1000)))