Luogu P1836 数页码_NOI导刊2011提高(04)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Luogu P1836 数页码_NOI导刊2011提高(04)相关的知识,希望对你有一定的参考价值。

题目描述

一本书的页码是从1—n编号的连续整数:1,2,3,…,n。请你求出全部页码中所有单个数字的和,例如第123页,它的和就是1+2+3=6。

输入输出格式

输入格式:

一行为n(1≤n≤1O^9)。

输出格式:

 一行,代表所有单个数字的和。

输入输出样例

输入样例#1:

3456789

输出样例#1:

96342015 

Solution

本题是让我们求1~n这n个数所有单个数字的和,我们可以试着把每一位所有出现过的数字的和先求出来,然后把每一位的答案加起来就是最终的答案了。

我们就看“3456789”这个例子,它的最高位(百万位)是两部分的和:

1. 1000000~1999999中的1和2000000~2999999中的2;(这里的和为1000000*(1+2))

2. 3000000~3456789中的3。(这里的和为(456789+1)*3)


做到这里我们已经可以略微摸索出一些规律了,我们在来看一下十万位:

1. 100000~2999999中的1~9,每个数都轮了3次;(这里的和为100000*(1+2+3+...+9)*3)

2. 3000000~3399999中的1~3;(这里的和为100000*(1+2+3))

3. 3400000~3456789中的4。(这里的和为(56789+1)*4)


这里比最高位(百万位)的操作多了一个步骤(其实也可以看做没有,但我习惯分开来算qwq),我们再来看一下万位:

1. 10000~3399999中的1~9,每个数轮了34次;(这里的和为10000*(1+2+3+...+9)*34)

2. 3400000~3449999中的1~4;(这里的和为10000*(1+2+3+4))

3. 3450000~3456789中的5。(这里的和为(6789+1)*5)


规律已经很明显了,所以我们只需要将最高位两步处理,而其他位根据我们得出的规律三步处理就行了。

这里具体的规律就不说了,只要看上面的例子和下面的代码应该就可以差不多理解了。


pascal代码如下:

var s:string;
n,m,i,j,k:longint;
ans:qword;
begin
  readln(n);
  str(n,s);
  i:=1;
  for m:=1 to length(s)-1 do
  i:=i*10;
  j:=n div i;
  n:=n mod i;
  ans:=i*j*(j-1) div 2+(n+1)*j;
  for m:=2 to length(s) do
  begin
    i:=i div 10;
    k:=k*10+j;
    j:=n div i;
    n:=n mod i;
    ans:=ans+i*45*k+i*j*(j-1) div 2+(n+1)*j;
  end;
  writeln(ans);
end.

以上是关于Luogu P1836 数页码_NOI导刊2011提高(04)的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 P1835 素数密度_NOI导刊2011提高(04)题解

luogu p1799 数列_NOI导刊2010提高(06)

luogu P1774 最接近神的人_NOI导刊2010提高(02)

luogu P1774 最接近神的人_NOI导刊2010提高(02)

洛谷 P1808 单词分类_NOI导刊2011提高(01)

贪心—— P1809 过河问题_NOI导刊2011提高(01)