十进制数的总和

时间:2011-03-22 21:52:43

标签: c++

以下是编程面试练习题 处理这个问题的聪明方法是什么?

数字M以相反的顺序存储在数组中。例如,数字274存储在以下数组中:

A[0]= 4 A[1]=7 A[2]=2

编写一个给定数字A表示某个数字的函数,返回数字M * 17的十进制表示的数字之和。数组大小可能非常大(超过2,000,000个元素)。

5 个答案:

答案 0 :(得分:3)

想象一下,你手写的乘以153乘以17。它看起来像这样:

  153
   17
  ---
   51
  85
 17
 ----
 2601

但实际上你并不需要保存完整的结果;你只需要随身携带数字。所以在第一步之后,你知道最后一个数字是1,然后你带5。然后在第二步之后你知道第二个数字是0,然后你带9.然后在第三步之后你知道第三个数字是6,随身携带2.当你的数字用完时,你只需要添加数字。 (你不能携带超过16个,所以你只需考虑两个案例。)

答案 1 :(得分:2)

以下代码将在O(n)中执行此操作。

#include <iostream>
#include <vector>

int times_17_dec_digits_sum(const vector<int> &A)
{
    int sum = 0, carry = 0;

    for (int i = 0; i < A.size(); i++) {
        int perdigitsum = A[i]*17+carry;
        sum += perdigitsum % 10;
        carry = perdigitsum / 10;
    }

    return sum + carry;
}

int main()
{
    std::vector<int> b;
    b.push_back(3);
    b.push_back(5);
    b.push_back(1);

    std::cout << times_17_dec_digits_sum(b) << std::endl;

    return 0;
}

答案 2 :(得分:2)

因为你在乘以17后加上所有数字,你可以计算出每个元素的数字总和:

17*3 = 51 => 5+1 = 6
17*5 = 85 => 8+5 = 13 
17*1 = 17 => 1+7 = 8

6 + 13 + 8 = 27 => 2+7=9

答案 3 :(得分:1)

三招

  • 而不是17 x,请使用(10 + 8 -1)x;然后
  • 代替10 x,转移位置;然后
  • 而不是8 x,位移。

E.g:

17 * [3,5,1] = 
7 * [3,5,1,0] + [0,3,5,1] = 
[3,5,1,0]<<3 - [3,5,1,0] + [0,3,5,1]

这些都是非常快速的操作,您可以按元素执行:

A[i] = A[i]<<3 - A[i] + A[i+1];

答案 4 :(得分:0)

将数字分解(或者更确切地说不构成)为十进制数字。循环容器将元素乘以17,取最后一个数字并将其与结果相加,将其余数字作为余数,并将其添加到下一次迭代中的乘法结果中。完成数组后,将余数中的数字添加到结果中。

int times17( const std::vector<int>& a ) {
   int result = 0, remainder = 0;
   for ( std::vector<int>::const_iterator it = a.begin(), end = a.end(); it != end; ++it )
   {
      int tmp = 17* *it + remainder;
      remainder = tmp / 10;
      result += tmp - remainder*10;
   }
   while ( remainder > 0 ) {
      result += remainder % 10;
      remainder /= 10;
   }
   return result;
}