在艺术序列中找到数字和

时间:2015-11-09 03:54:57

标签: c++ algorithm numbers range

我有一个非常简单的问题。我将获得算术进展的第一个术语和常见的差异。我需要在L和R的范围之间给出所有数字的总和。这里的总和意味着总数< 10表示对于一个数字表示157,数字的总和是1 + 5 + 7 = 13进一步是1 + 3 = 4。范围是元素的索引。 L表示该系列的第L个数,L从1开始。这里L和R的范围可以是1到10 ^ 18。如何在如此大的范围内找到这些数字的总和。我知道数字n的数字和可以计算为(n-1)%9 + 1。但我不能迭代10 ^ 18个数字。

示例:假设第一项算术级数为14且公差为7.然后,2到4之间所有数字的总和将为(2 + 1)= 3和(2 + 8)=( 1 + 0)= 1且(3 + 5)= 8,其等于12

用于模式发现

 current=first;
  ll arr[10]={0};
  while(1)// search for the pattern
  {
      ll dsum=(current-1)%9+1;// calculating digit sum
      if(arr[dsum]!=0)
        break;
      arr[dsum]=ptr;// saving the value in the array by using hashing
      ptr++;
      current+=c_diff;
  }
for sum

    for(ll i=1;i<ptr;i++)
  {
      sum[i]=sum[i-1]+new_arr[i];
  }

2 个答案:

答案 0 :(得分:0)

由于您的所有号码都将(最终)缩减为一位数,因此必须在一定数量的条款后重复,并且最多为9.(因为10位数,但是0不可能重复。)

所以,让我们从一个例子开始吧。说,a=14, d=7, l=2, r=50。我已经从您的示例中更改了r的值。

所以,试图找到重复:

  • 我们的重复数组是q(比如说​​)。然后,q的第一个词是5(因为14 = 5)。
  • 现在,下一个学期是21(= 3)。由于3不等于5,我们继续。
  • 我们找到所有条款,直到我们再次获得5。因此,q在此示例中将如下所示:

    q[] = {5,3,1,8,6,4,2,9,7}   ...  and then we have 5 again, so stop.
    

所以,我们的重复模式有9个成员。现在,找到一个累积和数组,它将类似于:

sum[] = {5,8,9,17,23,27,29,38,45}

现在,从r=50开始,找到r项的总和,这将是:

(floor)(50/9) * 45 + sum[50%9]
= 5 * 45 + 23
= 248

现在,同样地,查找l-1项的总和,(因为您必须在l..r范围内找到总和。

第1(2-1)= 1个术语的总和将是:

(floor)(1/9) * 45 + sum[1 % 9]
= 0 + 5
= 5

所以答案是,248 - 5 = 243。

答案 1 :(得分:0)

你可以通过取两个元素数组9并找到第l个元素来解决这个问题  从第l个项中找到第l个元素的数字和,并分别保存在两个数组中。

  

W1 = A +(L-1)* d
  for(i = 1,j = w1; i&lt; = 9; j + = d,i ++){
if if(j%9 == 0){
array1 [i] = 9;
数组2 [I] = 9;}

否则{
ARRAY1 [I] = j的%9;
数组2 [I] = j的%9;}                                    }
  现在q = r-l + 1
  w = q / 9和e = q%9
  array1 [i] = array1 [i] * w //在循环中从i = 1到9
  在array2 [i] = 0 //从i = e + 1到9的新循环   now digitsum + = array1 [i] + array2 [i] //从一个循环i = 1到9,digitum是序列的所有数字的总和

     

这个数字和是解决方案。