#计算1~N中数字X的个数,X=0~9.

计算1~N中数字X的个数,X=0~9.

转载

解题思路一:
遍历所有数字


#include <stdio.h>
// 计算数字 X 在 n 中出现的次数。

int countOne(int n, int x) {

    int cnt = 0;

    for (;n > 0;n /= 10) {

        if (n % 10 == x) {

            cnt++;

        }

    }

    return cnt;

}

// 计算数字 X 在 1-n 中出现的次数。

int count(int n, int x) {

    int cnt = 0;

    for (int i = 1;i <= n;i++) {

        cnt += countOne(i, x);

    }

    return cnt;

}

int main() {

    printf("%d\n", count(237, 1));

}

解题思路二:

分别求出个位、十位、百位……上X出现的次数

举个例子
首先要知道以下的规律:
•从 1 至 10,在它们的个位数中,任意的 X 都出现了 1 次。
•从 1 至 100,在它们的十位数中,任意的 X 都出现了 10 次。
•从 1 至 1000,在它们的千位数中,任意的 X 都出现了 100 次。

依此类推,从 1 至 10 i ,在它们的左数第二位(右数第 i 位)中,任意的 X 都出现了 10 i−1 次。

这个规律很容易验证,这里不再多做说明。

接下来以 n=2593,X=5 为例来解释如何得到数学公式。从 1 至 2593 中,数字 5 总计出现了 813 次,其中有 259 次出现在个位,260 次出现在十位,294 次出现在百位,0 次出现在千位。

现在依次分析这些数据,首先是个位。从 1 至 2590 中,包含了 259 个 10,因此任意的 X 都出现了 259 次。最后剩余的三个数 2591, 2592 和 2593,因为它们最大的个位数字 3 < X,因此不会包含任何 5。

然后是十位。从 1 至 2500 中,包含了 25 个 100,因此任意的 X 都出现了 25×10=250 次。剩下的数字是从 2501 至 2593,它们最大的十位数字 9 > X,因此会包含全部 10 个 5。最后总计 250 + 10 = 260。

接下来是百位。从 1 至 2000 中,包含了 2 个 1000,因此任意的 X 都出现了 2×100=200 次。剩下的数字是从 2001 至 2593,它们最大的百位数字 5 == X,这时情况就略微复杂,它们的百位肯定是包含 5 的,但不会包含全部 100 个。如果把百位是 5 的数字列出来,是从 2500 至 2593,数字的个数与百位和十位数字相关,是 93+1 = 94。最后总计 200 + 94 = 294。

最后是千位。现在已经没有更高位,因此直接看最大的千位数字 2 < X,所以不会包含任何 5。到此为止,已经计算出全部数字 5 的出现次数。

计算1-9出现的次数


// 计算数字 X 在 1-n 中出现的次数。

int count(int n, int x) {

    int cnt = 0, k;

    for (int i = 1;k = n / i;i *= 10) {

        // k / 10 为高位的数字。

        cnt += (k / 10) * i;

        // 当前位的数字。

        int cur = k % 10;

        if (cur > x) {

            cnt += i;

        } else if (cur == x) {

            // n - k * i 为低位的数字。

            cnt += n - k * i + 1;

        }

    }

    return cnt;

}

计算0出现的次数

// 计算数字 0 在 1-n 中出现的次数。

int countZero(int n) {

int cnt = 0, k;

// k / 10 为高位的数字。

for (int i = 1;(k = n / i) / 10;i *= 10) {

    cnt += (k / 10) * i;

    // k % 10 为当前位的数字。

    if (k % 10 == 0) {

        // n - k * i 为低位的数字。

        cnt += n - k * i + 1 - i;

    }

}

return cnt;

}

将以上整合一下

// 计算数字 X 在 1-n 中出现的次数。

int count(int n, int x) {

int cnt = 0, k;

for (int i = 1;k = n / i;i *= 10) {

    // 高位的数字。

    int high = k / 10;

    if (x == 0) {

        if (high) {

            high--;

        } else {

            break;

        }

    }

    cnt += high * i;

    // 当前位的数字。

    int cur = k % 10;

    if (cur > x) {

        cnt += i;

    } else if (cur == x) {

        // n - k * i 为低位的数字。

        cnt += n - k * i + 1;

    }

}

return cnt;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、 完成课本习题 3.2(a)(b), 课本文版《处理》第二版的 113 页。可以通过 matlab 帮助你分析理解。 (a) S=T(r)= Ε (m/r) + 1 1 2、一幅 8 灰度级图像具有如下所示的直方图,求直方图均衡后的灰度级和对应概率,并画出均衡后的直方图的 示意图。 (图的 8 个不同灰度级对应的归一化直方图为[0.17 0.25 0.21 0.16 0.07 0.08 0.04 0.02]) 由公式可知,变换函数的离散形式为 k=0,1,2,3…L-1 所以 S0=0.17 S1=S0+0.25=0.42 S2=S1+0.21=0.63 S3=S2+0.16=0.79 S4=S3+0.07=0.86 S5=S4+0.08=0.94 S6=S5+0.04=0.98 S7=S6+0.02=1 因为输出图像的灰度级是等间隔的,同时该图像具有 8 个灰度级 1/7,2/7,3/7,4/7,5/7,6/7,1 对之前求得的 Sk 进行修正 S0=1/7 S1=3/7 S2=4/7 S3=6/7 S4=6/7 S5=1 S6=1 S7=1 最后的灰度级仅有 5 个结果 S0=1/7 S1=3/7 S2=4/7 S3=6/7 S4=1 与此相对应的概率为 PS(s0)=0.17 PS(s1)=0.25 PS(s2)=0.21 PS(s3)=0.23 PS(s4)=0.14 3. (选做题)课本习题 3.6。对于离散的情况,用 matlab 进行一下实验。 一样。直方图均衡化的结果一次到达极限。 对于离散的情况,设 n 为图像像素的总和, k n 1 为输入图像灰度级为 k r 的像素的个数。 所以,直方图均衡化的转换公式为: k j k k j k k k n n n n r T s 0 = 1 0 = 1 1 = / = ) ( = 由于输入图像灰度级为 k r 的像素被映射到输出图像灰度级为 k s 的对应像素得到,所以 k k n n 2 1 = 那么,在第二次均衡化的过程,转换函数为 k j k k k n n s T v 0 = 2 1 = ) ( = 所以,两次转换过程 k k v n = ,既结果相同。 4. 4 完成课本数字图像处理第二版 114 页,习题 3.10。 对于作图, r r dw w dw w p r T s r r r 2 ) 2 2 - ( ) ( ) ( 2 0 0 1 对于右图, 2 0 0 2 2 ) ( ) ( z wdw dw w p z T v z z z 所以, 2 2 r r z 4.请围绕本周课堂讲授的内容编写至少一道习题,并给出自己的分析解答。题目形式可以是填空题、选择题、判断 对错题、计算题、证明题。发挥你的创造力吧。 利用 matlab 绘制幂次变换在不同 γ 下的曲线,并分析图像产生差异的原因和不同取值对变换结果产 幂次曲线的 γ 的部分之吧输入的窄带暗值映射到宽带输出值上,相反,输入高值也对应成立。随着 γ 取值的变 化,我们能够得到一组变换曲线,c= γ =1 时为正比变换, γ >1 时图像偏暗, γ <1 时图像偏亮。 γ >1 时,从图我 们可以看到输出灰度级大部分被压缩在较低的水平上, γ <1 时,从图我们可以看到输出灰度级大部分被压缩在 较高的水平上。 2、 请计算如下两个向量与矩阵的卷积计算结果。 (1) [ 1 2 3 4 5 4 3 2 1] *[ 2 0 -2] 设向量 x1=[1 2 3 4 5 4 3 2 1 ],向量 x2=[2 0 -2],添加下划线的元素设定为 0 位置 x1 1 2 3 4 5 4 3 2 1 -x2 -2 0 2 ————————————————————————————————————— 2 4 6 8 10 8 6 4 2 -2 -4 -6 -8 -10 -8 -6 -4 -2 —————————————————————————————————————————— -2 -4 -4 -4 -4 0 4 4 4 4 2 所以卷积结果为:2 4 4 4 4 0 -4 -4 -4 -4 -2 (2) [ 1 0 1 2 0 2 1 0 1 ] [ 1 3 2 0 4 1 0 3 2 3 0 4 1 0 5 2 3 2 1 4 3 1 0 4 2] = 设题目给定的两个矩阵分别为 d 和 e,大小分别为 3x3 和 5x5,卷积结果为一个 7x7 的矩阵 根据卷积公式, ) , ( ) , ( 1 ) , ( * ) , ( 1 0 1 0 n y m x h n m f MN y x h y x f M m N n F(-3,-3)=e(-2,-2)d(-1,-1)=-1 F(-3,-2)=e(
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值