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

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

题目描述

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例: 
3456789
输出样例: 
96342015 

我的想法是这样的:

分别考虑个位,十位,百位,千位,万位...

可以发现

其中res(i)表示第i位数相加之和。

故代码如下:

 1 #include <cstdio>
 2 using namespace std;
 3 long long n;
 4 int sum[10]={0,1,3,6,10,15,21,28,36,45};
 5 
 6 int get(int n)
 7 {
 8     if(n<0)return 0;
 9     return n;
10 }
11 
12 long long get_ans(long long n)
13 {
14     long long res=0,a=1,b=0;    
15     while(n>0)
16     {
17         res=res+a*(45*(n/10)+sum[get(n%10-1)])+(n%10)*(b+1);
18         b=b+(n%10)*a;a*=10;
19         n/=10;
20     }
21     return res; 
22 }
23 
24 int main()
25 {
26     scanf("%lld",&n);
27     printf("%lld\n",get_ans(n));
28     return 0;
29 }
View Code

我的代码里对打了表。

觉得不错的话点个赞欧

————————————————————————————————————————————————————————————

自创文章,欢迎转载

posted @ 2019-01-26 14:50  __Michael  阅读(365)  评论(0编辑  收藏  举报