Первый член математической формулы - PullRequest
0 голосов
/ 05 октября 2019

В настоящее время я разбираюсь в логике первого слагаемого в формуле.

Почему 45 умножается на умножение. А также почему умножается «я». Формула вычисляет сумму всех цифр всех чисел от 1 до N. Например, если N = 11, сумма будет 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + (1 + 0)+ (1 + 1) = 48.

long long sum(long long N){
    if(N/10==0) return N*(N+1)/2;
    int i=0;
    long long n=N;
    while(n/10!=0){
        i++;
        n/=10;
    }
    int p=pow(10,i);
    return ((n*45*i*p/10)+ n*(n-1)*p/2+ n*(N%p+1) + sum(N%p));
}

1 Ответ

0 голосов
/ 06 октября 2019

Я не думаю, что это работает. Если я добавлю вход 11 в вашу функцию, я думаю, что получу 45 + 0 + 2 + 1, где я ожидаю 2. Я бы ожидал что-то вроде этого грубого усилия:

unsigned long long sum_digits(unsigned long long N) {
  size_t exp = std::log10(N);

  unsigned long long result = 0u;
  for (size_t i = 0u; i <= exp; ++i) {
    //isolate the (i+1)th digit
    long long ub = std::pow(10, i+1);
    long long lb = std::pow(10, i);
    size_t digit = (N % ub) / lb;

    //add the digit's contribution to the sum
    result += digit * (digit + 1) / 2;
  }

  return result;
}

Я бы ожидал суммуцифр, чтобы выглядеть больше так, но я могу просто неправильно понять цель этого алгоритма.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...