梦中的统计(求错误点)

img



#include
int main()
{
    int m,n,i,j,k;
    int t[10]={0};
    scanf("%d %d",&m,&n);
    for(i=m;i<=n;i++)
    {j=i;while(j>=0)
    {k=j%10;j/=10;
    if(k==0)t[0]++;
    else if(k==1)t[1]++;
    else if(k==2)t[2]++;
    else if(k==3)t[3]++;
    else if(k==4)t[4]++;
    else if(k==5)t[5]++;
    else if(k==6)t[6]++;
    else if(k==7)t[7]++;
    else if(k==8)t[8]++;
    else if(k==9)t[9]++;
    }
    }for(i=0;i<=9;i++)
    printf("%d ",t[i]);
    return 0;
}

好像超时了,不知道哪错了,求解!!


#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

int m, n, res[10];

int main() {
    cin >> m >> n;
    for (int i = m; i <= n; i++) {
        int t = i;
        while (t) {
            res[t % 10]++;
            t /= 10;
        }
    }
    for (int i = 0; i < 9; i++) {
        cout << res[i] << " ";
    }
    cout << res[9] << endl;
    return 0;
}

你这份代码的错误在于在循环内部有一个无限循环的情况:

while(j>=0)

当j变为0时,这个循环将永远不会停止。为了避免这种情况,可以将它改为以下内容:

while(j>0)

这样,当j变为0时,循环将停止。

思路是正确的,但是代码实现有点繁琐,代码量比较大。你可以使用循环和数组来简化代码,例如:

#include<stdio.h>

int main()
{
    int m, n;
    int t[10] = {0};
    scanf("%d%d", &m, &n);

    for(int i = m; i <= n; i++)
    {
        int j = i;
        while(j > 0)
        {
            t[j % 10]++;
            j /= 10;
        }
    }

    for(int i = 0; i < 10; i++)
    {
        printf("%d ", t[i]);
    }

    return 0;
}

  • while循环那边,判断 改成 j > 0,等于0的话,因为 0/10 一直是 0,就进入死循环;
  • 上述 j=0的情况,即 i = 0的情况,需要单独讨论;
  • 修改如下试试:

#include<stdio.h>
int main()
{
    int m,n,i,j,k;
    int t[10]={0};
    scanf("%d %d",&m,&n);
    for(i=m;i<=n;i++)
    {
        j=i;
        if (i==0) 
            t[i]++;
        while(j>0)
        {
            k=j%10;
            j/=10;
            t[k]++;
        }
    }
    for(i=0;i<=9;i++)
        printf("%d ",t[i]);
    return 0;
}