求等差数列中的数字和

finding the digit sum in a arthematic sequence

我有一个很简单的问题。我会得到算术级数的第一项和公差。我需要给出 L 和 R.Here 范围内所有数字的数字总和,总和表示总和 <10,这意味着对于一个数字,比如 157,数字总和是 1+5+7=13也就是 1+3=4。范围是元素的索引。 L 表示该系列的第 L 个数字,L 从 1.Here L 开始,R 的范围可以是 1 到 10^18。我怎样才能找到这么大范围内这些数字的总和。我知道数字 n 的数字和可以计算为 (n-1)%9+1。但我不能迭代超过 10^18 个数字。

示例:假设算术级数第一项是 14,公差 7.Then 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];
  }

由于您的所有数字将(最终)减少到一位数,因此您必须在一定数量的术语后重复,并且最多为 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。

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

w1=a+(l-1)*d
for(i=1,j=w1;i<=9;j+=d,i++){
if(j%9==0){
array1[i]=9 ;
array2[i]=9;
}
else{
array1[i]=j%9;
array2[i]=j%9;} }
now q = r-l+1
w= q/9 and e=q%9
array1[i]=array1[i]*w // in loop from i= 1 to 9
in array2[i]=0 //new loop from i=e+1 to 9
now digitsum += array1[i]+array2[i] // from a a loop i=1 to 9 and digitsum is the sum of all digit of sequence

this digit sum is solution.