找到整数序列的数字总和

时间:2014-09-14 17:31:05

标签: c++ vector iterator sum digits

我下定决心写一小段代码得到两个整数,让我们说M和N(M <= N)并将它们之间所有整数的数字相加,包括在内。因此,例如,如果M = 1且N = 9,则DigitSum将等于45.如果M = 10且N = 11,则总和将是(1 + 0(10)+ 1 + 1(11)= 3)。 这是我到目前为止的代码(完成for循环而不是返回):

#include <iostream>
#include <vector>

using namespace std;
// the partial digits sums digitSum[i] = the sum of the digits between 0 and i
int digitSum[] = {0, 1, 3, 6, 10, 15, 21, 28, 36, 45};
int pow_of_ten[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
 // the sums of all the digits in the numbers from 1 to (10^(i) - 1) where i is the index in the array
long subsums[] = {0, 45, 20 * 45, 300 * 45, 4000 * 45, 50000 * 45, 600000 * 45, 7000000 * 45, 80000000 * 45,
    900000000 * 45};
//Calculates the sum of all digits between 0 and M inclusive
long Digit_Sum(int M) {

  if (M < 10) {
    return digitSum[M];
  }
  long result = 0;
  int same = M;
  int counter = 0;
  int lastdigit = 0;
  while (same > 0) {
    if (same <  10) {
      lastdigit = same;
      break;
    }
    same /= 10;
    counter ++;
  }
  for(;counter >= 0; counter --) {
    result += (subsums[counter] + M % pow_of_ten[counter] + 1) * lastdigit;
    result += digitSum[lastdigit - 1] * pow_of_ten[counter];
    if (counter == 0) {
      break;
    }
    lastdigit = (M / pow_of_ten[counter - 1]) % 10;
  }
  return result;

}

int main() {

int M;
int N;
vector<long> sums;
while (true) {
  cin >> M >> N;
  if (M == 0 &&  N == 0) {
    break;
  }
  sums.push_back(Digit_Sum(N) - Digit_Sum(M - 1));
}

for (vector<long>::iterator it = sums.begin(); it != sums.end(); ++it) {
  cout << *it << endl;
}
}

对于大多数情况,这种方法效果很好,但在线评判认为这是错误的。我查看了其他可行的解决方案,但没有人按照我的方式对数组中的值进行硬编码。这可能导致部分问题,任何想法?

3 个答案:

答案 0 :(得分:0)

您可以轻松地创建一个for循环来大大简化此代码。

没有必要经过所有这些努力。

for (Initialization Action, Boolean Expression, Update_Action)

答案 1 :(得分:0)

下面重新删除:对不起,我有一点流感和mizread NM。 :(

我认为主要错误是

中的M-1

        <德尔> sums.push_back(Digit_Sum(N) - Digit_Sum(M - 1));

还注意到&lt; 更正时该公式仅适用于单位数字。我之前关于使用简单公式的评论是基于对您的问题描述的误解,考虑到该公式和您的示例。两者都只显示了一位数字。

然而,代码的复杂性似乎过高。考虑这一点,假设非负整数作为输入,并假设m总是小于或等于n

#include <iostream>
#include <stdexcept>
using namespace std;

bool throwX() { throw std::runtime_error( "Ouch." ); }

auto main() -> int
{
    for( ;; )
    {
        int m, n;
        cin >> m >> n || throwX();
        if( m == 0 && n == 0 ) { break; }

        int sum = 0;
        for( int i = m; i <= n; ++i )
        {
            for( int v = i; v != 0; v /= 10 )
            {
                sum += v % 10;
            }
        }
        cout << sum << endl;
    }
}

它不需要那么复杂。

答案 2 :(得分:0)

测试并使用规范,没有控制台输入:

#include <iostream>
#include <string>
using namespace std;

void sum_a_to_b(const int & a, const int & b)
{
    if (a <= b && a >= 0)
    {
        long long sum = 0;
        for (int i = a; i <= b; i++)
        {
            sum += i;
        }
        cout << "Sum of digits from " << a << " through " << b << " is " << sum << ".\n";
    }
}

int main()
{
    sum_a_to_b(5, 6);
    sum_a_to_b(1, 9);
}