/************************************************************/
#include <iostream>
using namespace std;
long Result[10];
int Num;
int Pow10;
static void PreCheck( int n );
void Check( int a, int b );
int main()
{
int a, b;
int i;
while ( cin>>a>>b && a!=0 && b!=0 )
{
Check(a,b);
cout<<Result[0];
for ( i=1; i<= 9; i++ )
{
cout<<" "<<Result[i];
}
cout<<endl;
}
return 0;
}
static void PreCheck(int n)
{// 分析 <= n的所有数, and n>0
int i;
int R1, R2, Q;
while ( n != 0 )
{//对n从右至左逐位分析,分割成 [R2][Q][R1],Q位逐渐向左移
R1 = Num % Pow10;
Q = n % 10;
Pow10 *= 10;
R2 = Num / Pow10;
n /= 10;
if ( Q == 0 )
{// 处理0要注意
Result[0] += R1+1;
Result[0] += (R2 - 1) * Pow10 / 10;
}
else
{
Result[0] += R2 * Pow10 / 10;
}
for ( i=1; i<=9; i++ )
{
if ( i < Q )
{
Result[i] += (R2+1) * Pow10 / 10;
}
else if ( i == Q )
{// 处理0要注意
Result[i] += R1 + 1;
Result[i] += R2 * Pow10 / 10;
}
else
{
Result[i] += R2 * Pow10 / 10;
}
}
}
}
void Check( int a, int b )
{// 对满足a<= x <=b的数各位进行统计
int i;
int TempResult[10];
i = a<b?a:b;
b = a+b;
a = i;
b = b-i;
// make sure a <= b, then [a-1,b]
for ( i=0; i<=9; i++ )
Result[i] = 0;
Pow10 = 1;
Num = a-1;
PreCheck( a-1 );
for ( i=0; i<=9; i++ )
TempResult[i] = Result[i];
for ( i=0; i<=9; i++ )
Result[i] = 0;
Pow10 = 1;
Num = b;
PreCheck( b );
for ( i=0; i<=9; i++ )
Result[i] -= TempResult[i];
}
HDU ACM 1663
最新推荐文章于 2019-02-28 22:21:59 发布