Какова сумма цифр числа 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)))