在数学序列中求数字和

finding the digit sum in a arthematic sequence

本文关键字:数字      更新时间:2023-10-16

我有一个非常简单的问题。我将提供算术级数的第一个学期和共同的区别。我被要求给出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];
  }

由于所有数字都将(最终)减少到一个数字,因此必须在一定数量的项之后进行重复,即最多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并找到第lth项元素来解决这个问题
从第lth项中找到第lth元素的数字和,并将其分别保存在两个数组中

w1=a+(l-1)*d
对于(i=1,j=w1;i<=9;j+=d,i++}
现在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
的新循环中现在digitalsum+=array1[i]+array2[i]//从循环i=1到9,digitalsum是序列所有数字的总和

这个数字和就是解