在数学序列中求数字和
finding the digit sum in a arthematic sequence
我有一个非常简单的问题。我将提供算术级数的第一个学期和共同的区别。我被要求给出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是序列所有数字的总和这个数字和就是解
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何用数字处理log(0)
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 查找最接近的大于当前数字的数字的索引
- 找到两对数字,使它们的乘积的绝对差最小化
- 我想做一个彼此不同但重复出现的数字
- 将数字转换为字母(例如:123 转换为一二三)
- C++如何计算用户输入的数字中的偶数位数
- 如何在C++中确定文本文件中的元素是字符还是数字
- 打印数字图案
- C++问题:用户认为数字1-100,程序提出问题不超过6次即可得到答案。无法正确
- 如何检查一个c++字符串中有多少相同的字符/数字
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 将数字打印成文字
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 在将数字随机生成为数组期间从内存输出随机数的数组