HDU ACM 1663

来源:互联网 发布:疯狂的美工自由布局 编辑:程序博客网 时间:2024/06/05 04:52

/************************************************************/
#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];
}