你最愿意做的哪件事,才是你的天赋所在

0%

Digit sum from 1 to n(计数)

题目链接

Digit sum

思路

这题就是计算1-n的各个位数之和,那么我们可以对每个位置进行统计。
例如,328,
先看百位
3(28+1)
2
100
1100
再看十位
2
(8+1)
110
这时候需要计算111 112 中的十位
也就是1+2+3+4+5+6+7+8+9=45,计算有多少个45.注意,这时候先不看个位。我们有110 120 130 140 150 160 ~290 ,也就是有3组,就是3
4510.
然后再看个位8+7+6+5+4+3+2+1,然后45
32*1;
就好了

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include<bits/stdc++.h>
using namespace std;
long long sumOfDigits(int n,int b) {
int sums[11];
int m=n;
long long sum = 0;
for(int i = 0; i <= b; i++) {
sum += i;
sums[i+1] = sum;
}
sum=0;
vector<int>nums;
queue<int>num;
while(n)
{
nums.push_back(n%b);
n/=b;
}
for(int i=nums.size()-1;i>=0;i--)
{
num.push(nums[i]);
}
int now = 0;
while(!num.empty())
{
int x=num.front();num.pop();
int len = num.size();
sum+=x*(m-pow(b,len)*x+1);
m-=pow(b,len)*x;
sum+=sums[x]*pow(b,len);
sum+=sums[b]*now*pow(b,len);
now*=b;
now+=x;
}
return sum;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,x;
scanf("%d %d",&n,&x);
printf("%lld\n",sumOfDigits(n,x));
}
}
-------------你最愿意做的哪件事才是你的天赋所在-------------