HDU ACM 1663

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值