输入一个数字n,统计1到n使用了多少个0,1,2,,9。
#include <stdio.h>
#include <string.h>
#include <math.h>
void pageNumber(int n, long long cnt[]) {
memset(cnt, 0, 10 * sizeof(long long));
int tmp = n, len = 1;//len表示整数n的位数
while (tmp /= 10)
len++;
tmp = len;
while (len > 0) {
int high = n / (int)pow(10.0, len - 1),
left = n % (int)pow(10.0, len - 1);
for (int i = 0; i <= 9; ++i)
cnt[i] += (len - 1)*(int)pow(10.0, len - 2)*high;
for (int i = 0; i<high; ++i)
cnt[i] += (int)pow(10.0, len - 1);
cnt[high] += left + 1;
n = left;
len--;
}
//多加了 (len-1)个1组成的数 个零
for (int i = 0; i<tmp; ++i)
cnt[0] -= (int)pow(10.0, i);
}
int main()
{
int n;
long long cnt[10];
while (~scanf("%d", &n)) {
pageNumber(n, cnt);
for (int i = 0; i < 10; ++i)
printf("%lld\n", cnt[i]);
}
return 0;
}
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
void pageNumber (long long n, long long cnt[]);
int main () {
freopen("data.out", "w", stdout);
long long x, y;
while (cin >> x >> y) {
if (!(x | y)){
break;
}
if (x > y) {
swap(x, y);
}
x -= 1;
long long ans[10] = { 0 }, cnt2[10] = { 0 };
pageNumber (y, ans);
pageNumber (x, cnt2);
for (int i = 0; i < 10; ++i) {
ans[i] -= cnt2[i];
}
cout << ans[0];
for (long long i = 1; i <= 9; ++i)
cout << ' ' << ans[i];
cout << endl;
}
}
void pageNumber (long long n, long long cnt[]) {
memset (cnt,0,10*sizeof(long long));
long long tmp = n, len = 1;
while (tmp /= 10)len++;
tmp=len;
while (len>0) {
long long highBit = n / (long long)pow(10.0, len - 1),
left = n % (long long)pow(10.0, len - 1);
for (long long i = 0;i <=9 ;++i)
cnt[i] += (len-1) * (long long)pow(10.0,len-2) * highBit;
for (long long i = 0; i<highBit; ++i)
cnt[i] += (long long)pow(10.0, len - 1);
cnt[highBit] += left + 1;
n = left;
len--;
}
for (long long i = 0; i<tmp; ++i)
cnt[0] -= (long long)pow(10.0, i);
}