计数问题

本文介绍了一个计算在指定区间[a, b]内所有整数中数字1出现次数的算法实现。通过一个简单的C语言程序,展示了如何逐位检查每个数字并累计1的出现次数。该算法适用于竞赛编程等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题陈述:

http://acm.hrbeu.edu.cn/index.php?act=problem&id=1001&cid=17

给你两个数a和b,你的任务是计算出1在a和b之间出现的次数,比如说,如果a=1024,b=1032,那么a和b之间的数就是:

1024 1025 1026 1027 1028 1029 1030 1031 1032

则有10个1出现在这些数中。

简单的实现思路:


#include <stdio.h>
#include <stdlib.h>

int CountDigists(int n)
{
int count = 0;
while(n > 0)
{
if(n % 10 == 1)
{
count++;
}
n = n / 10;
}

return count;
}

int CountRangeDigists(int a, int b)
{
int ret = 0;
int i = 0;
for(i = a; i <= b; ++i)
{
ret += CountDigists(i);
}

return ret;
}

int main()
{
int a[500], b[500];

int i = 0;
// get the intput
while((scanf("%d %d", &a[i], &b[i]) == 2) &&
(a[i] !=0 ) &&
(b[i] != 0))
{
++i;
}

// ooutput the result
int j = 0;
for( ; j <= (i - 1); ++j)
{
printf("%d/n", CountRangeDigists(a[j], b[j]));
}

return 0;
}


上面仅仅是最简单的实现方法,更为直接的方式是通过计算得到计算公式,个人认为比较麻烦。再次略去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值