• 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.
  • 相关阅读:
    Nginx的反向代理和负载均衡
    大数据开发——Hive笔记
    Mysql-索引分析查询性能
    数据库原理-事务隔离与多版本并发控制(MVCC)
    并发编程实战--知识图谱
    并发编程实战-线程池
    并发编程实战-保证线程安全方式
    Synchronized和ReentTrantLock二者区别
    并发编程实战-J.U.C核心包
    并发编程实战-ConcurrentHashMap源码解析
  • 原文地址:https://www.cnblogs.com/qbwhtc/p/7570978.html
Copyright © 2020-2023  润新知