梦中的统计计算鸭处于半梦半醒的状态。过了一会儿,她意识到她在数数,不能入睡。她开始注意每一个数码(0\ldots 90…9):每一个数码在计数的过程中出现过多少次?给出两个整数 n

#include<bits/stdc++.h>
using namespace std;
int cnt[9000000];
int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    int b = 0;
    for (int i = n; i <= m; i++)
    {
        int num = i;
        while (num > 0)
        {
            b = num % 10;
            num /= 10;
            cnt[b]++;
        }
    }
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", cnt[i]);
    }
    return 0;
}

<think>好的,我现在需要解决这个问题:给定两个整数M和N,统计在序列[M, M+1, ..., N]中每个数字0-9出现的次数。用户给出的代码看起来有问题,可能需要修正,但现在我需要先理解问题本身,然后找出正确的解决方法。 首先,题目要求的是,对于每个数字09计算在M到N之间的所有数中各个数字出现的次数总和。例如,如果M是1,N是12,那么0出现的次数可能是在10、11、12中的情况,具体需要逐个分析。 那用户提供的代码片段似乎有问题。让我看一下他的代码: ```cpp #include<bits/stdc++.h> using namespace std; char a[11]; int main(){ cin>>a; int num; for(int i=6;i<=10;i++){ num=num*10+(int)a[i]; } cout<<num; return 0; } ``` 这段代码看起来像是读取一个字符串,然后从第6到第10位的字符转换为整数。但这里的a数组的大小是11,所以索引应该是从0到10。假设输入的字符串长度足够,比如是11位的话,那么循环取i=6到i=10的位置。例如,假设输入的是类似"12345678901"这样的字符串,那么取第6到第10位字符(即索引6到10,字符是&#39;7&#39;,&#39;8&#39;,&#39;9&#39;,&#39;0&#39;,&#39;1&#39;),然后转换为数字。但这段代码有几个问题:首先,num变量没有初始化,初始值是未定义的;其次,将字符转换为数字时应该减去&#39;0&#39;的ASCII值,否则直接转换为int得到的是字符的ASCII码值。比如字符&#39;7&#39;的ASCII是55,直接转换的话就会得到错误的结果。 但用户的题目背景是关于统计数字出现次数的问题,而提供的代码似乎和题目无关。可能是用户误贴了代码?或者这代码是他自己尝试写的但存在错误? 不管怎样,现在我需要解决的是正确的统计问题。正确的解法应该如何处理? 首先,直接遍历每个数字,然后统计每个数字中的每一位,这样的方法对于大范围的M和N来说可能效率不够。比如当N-M的范围是5e5时,每个数最多有10位,所以总操作次数是5e5*10=5e6次,这在时间上是可行的。因为题目中的约束条件是N-M<=5e5,所以直接暴力法可能可以通过。 那正确的做法应该是这样的:对于每一个数i,从M到N,将这个数的每一位分解出来,统计每个数字出现的次数。然后累加到结果数组中。 比如,数字123,各位是1、2、3,所以对应的计数器各加1。 这样的话,可以用一个数组ans[10]来保存结果,初始化为0。然后遍历每个数i,分解各位,更新ans数组
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值