(Relax 数论1.29)POJ 3286 How many 0's?(统计a-b之间-出现的次数)


POJ 3286:统计a--b之间,0出现的次数

#include <iostream>
#include <cstdio>

using namespace std;

typedef long long ll;

ll a, b;
ll ansa[10], ansb[10];

void count_digits(ll s, ll ans[], ll times = 1) {//求1-s之间的所有数中 0的个数,1的个数,2.....其中ans[0...9]为返回值
	ll i, d, p;
	if (s <= 0)
		return;
	d = s % 10;
	p = s / 10;
	for (i = 1; i <= d; i++)
		ans[i] += times;
	while (p > 0) {
		ans[p % 10] += (d + 1) * times;
		p = p / 10;
	}

	for (i = 0; i <= 9; i++)
		ans[i] += times * (s / 10);

	times *= 10;
	count_digits((s / 10) - 1, ans, times);
	return;
}

//以上是区间统计数字的模板....

int main(){
	while(scanf("%lld%lld",&a,&b)!=EOF,a>=0&&b>=0){
		if(a == 0 && b == 0){//如果区间的两个端点都是0,则0出现的次数是1...
			printf("1\n");
			continue;
		}

		if(a > b){
			swap(a,b);
		}

		bool flag = false;
		if(a == 0){
			flag = true;
		}

		a -= 1;
		memset(ansa,0,sizeof(ansa));
		memset(ansb,0,sizeof(ansb));
		count_digits(a,ansa);
		count_digits(b,ansb);

		if(flag){//如果区间的左端点是1,则0出现的次数+1
			ansb[0]++;
		}

		printf("%lld\n",ansb[0] - ansa[0]);

	}

	return 0;
}


POJ 2282 :统计a--b之间0-9各个元素出现的次数

#include <iostream>
#include <cstdio>

using namespace std;

typedef long long ll;

ll a, b;
ll ansa[10], ansb[10];

void count_digits(ll s, ll ans[], ll times = 1) {//求1-s之间的所有数中 0的个数,1的个数,2.....其中ans[0...9]为返回值
	ll i, d, p;
	if (s <= 0)
		return;
	d = s % 10;
	p = s / 10;
	for (i = 1; i <= d; i++)
		ans[i] += times;
	while (p > 0) {
		ans[p % 10] += (d + 1) * times;
		p = p / 10;
	}

	for (i = 0; i <= 9; i++)
		ans[i] += times * (s / 10);

	times *= 10;
	count_digits((s / 10) - 1, ans, times);
	return;
}

int main(){
	while(scanf("%lld%lld",&a,&b)!=EOF,a||b){
		memset(ansa,0,sizeof(ansa));
		memset(ansb,0,sizeof(ansb));

		if(a > b){
			swap(a,b);
		}

		a -= 1;

		count_digits(a,ansa);
		count_digits(b,ansb);

		int i;
		for(i = 0 ; i < 10 ; ++i){
			printf("%lld ",ansb[i] - ansa[i]);
		}
		printf("\n");
	}

	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅气的东哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值