heu acm基础训练 1001

哈尔滨工程大学 online judge acm训练之分治算法

原题大意:求a ,b,之间的数有多少个1,包括a,b.

这题典型的分治算法;

举例说明:

以197为例:

那么我们将其分为个位,十位,个位7上有一个,那么在190~197上有7+1个

然后整十位上的为18,即197/10-1,然后其权值将变为10。如此进行。

源代码:

#include<stdio.h>

#define N 11

int d[N],value;

int deal(int n)

{

int one ,ten ;

if(t<=0)

one=n%10;

ten=n/10;

n/=10;

for(int i=0;i<=one;i++)

d[i]+=value;

while(ten)

{

d[ten%10]+=value*(one+1);

ten/=10;

}

for(int i=0;i<N;i++)

d[i]+=value*n;

d[0]-=value;

value*=10;

deal(n-1);

}

int main()

{

int a,b;

while(scanf("%d%d",&a,&b))

{

if(!a,!b)

break;

if(a<b)

swap(a,b);

value=1;

deal(a);

value=-1;

deal(b-1);

printf("%d\n",d[1]);

}

}

d【】中存有0~9的个数,题目的话只用d[1]即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值