不同处用114514标记了 AC代码:
#include<bits/stdc++.h>
using namespace std;
#define N 12
long long a,b,cnta[20],cntb[20],ten[20],dp[20],num[20],len;
void init() {
ten[0] = 1;//////
for (int i = 1;i <= N;i ++) {
ten[i] = 10 * ten[i - 1];
dp[i] = i * ten[i - 1];
}
return;
}
void solve(long long x,long long *cnt) {
len = 0;
while (x) {
num[++ len] = x % 10;
x /= 10;
}
for (int i = len;i >= 1;i --) {
for (int j = 0;j <= 9;j ++)
cnt[j] += num[i] * dp[i - 1];
for (int j = 0;j < num[i];j ++)//-----------114514
cnt[j] += ten[i - 1];
/*long long tmp = 0;
for (int j = i - 1;j >= 1;j --)
tmp = tmp * 10 + num[j];
cnt[num[i]] += tmp + 1;*/
for (int j = 1;j < i;j ++)
cnt[num[i]] += num[j] * ten[j - 1];
++ cnt[num[i]];
cnt[0] -= ten[i - 1];//--------114514
}
return;
}
int main() {
scanf("%lld%lld",&a,&b);
init();
solve(a - 1,cnta);
solve(b,cntb);
for (int i = 0;i <= 9;i ++)
printf("%lld ",cntb[i] - cnta[i]);
printf("\n");
return 0;
}
30pts代码:
#include<bits/stdc++.h>
using namespace std;
#define N 12
long long a,b,cnta[20],cntb[20],ten[20],dp[20],num[20],len;
void init() {
ten[0] = 1;//////
for (int i = 1;i <= N;i ++) {
ten[i] = 10 * ten[i - 1];
dp[i] = i * ten[i - 1];
}
return;
}
void solve(long long x,long long *cnt) {
len = 0;
while (x) {
num[++ len] = x % 10;
x /= 10;
}
for (int i = len;i >= 1;i --) {
for (int j = 0;j <= 9;j ++)
cnt[j] += num[i] * dp[i - 1];
for (int j = 1;j < num[i];j ++)//---------114514
cnt[j] += ten[i - 1];
/*long long tmp = 0;
for (int j = i - 1;j >= 1;j --)
tmp = tmp * 10 + num[j];
cnt[num[i]] += tmp + 1;*/
for (int j = 1;j < i;j ++)
cnt[num[i]] += num[j] * ten[j - 1];
++ cnt[num[i]];
}
return;
}
int main() {
scanf("%lld%lld",&a,&b);
init();
solve(a - 1,cnta);
solve(b,cntb);
for (int i = 0;i <= 9;i ++)
printf("%lld ",cntb[i] - cnta[i]);
printf("\n");
return 0;
}