计数的梦中一个很奇怪的问题

题目很简单,就只是在m和n数字范围内,阿拉伯数字0-9出现的次数。
一代码 在论坛里找的

#include <iostream>
using namespace std;
int main()
{
    int a[10]={0};
    int M,N;
    cin>>M>>N;
    for(M;M<=N;M++)
    {
        int i=M;
        while(i)
        {
            a[i%10]++;
            i=i/10;
        }
    }
    for(int j=0;j<10;j++)
    {
        cout<<a[j]<<" ";
    }
    return 0;
}

二代码 我自己写的,根本不成功,然后我一点点向一代码对齐,发现了一个我觉得不可能的现象

#include <iostream>
using namespace std;
int main()
{
    int a[10] = { 0 };
    int M, N;
    cin >> M >> N;
    for (int i=M; i <= N; M++)
//只有这里不一样,我和一代码的区别,但是我觉得没 
//啥问题的,就是不能运行    
{
        while (i)
        {
            a[i % 10]++;
            i = i / 10;
        }
    }
    for (int j = 0; j < 10; j++)
    {
        cout << a[j] << " ";
    }
    return 0;
}

有没有好人能够解答迷惑,谢谢!*3
改了之后还是不行

img

你可以看下那个for循环执行的流程就知道了,你的循环的终止条件是i<=N,这个循环是不会结束的,因为i=M在for循环中只调用了一次

i++不是M++,

#include <iostream>
using namespace std;
int main()
{
    int a[10]={0};
    int M,N;
    cin>>M>>N;
    for(int i=M;i<=N;i++)
    {
        int j=i;
        while(j)
        {
            a[j%10]++;
            j=j/10;
        }
    }
    for(int j=0;j<10;j++)
    {
        cout<<a[j]<<" ";
    }
    return 0;
}

以下内容部分参考ChatGPT模型:


问题在于你的第二个代码中for循环中的计数器不是i,而是M,所以程序会进入死循环。修改为i即可:

#include <iostream>
using namespace std;
int main()
{
    int a[10] = { 0 };
    int M, N;
    cin >> M >> N;
    for (int i=M; i <= N; i++)
    {
        int j = i;
        while (j)
        {
            a[j % 10]++;
            j = j / 10;
        }
    }
    for (int j = 0; j < 10; j++)
    {
        cout << a[j] << " ";
    }
    return 0;
}

这个代码的思路和一楼的代码是一样的,使用一个数组a来记录0-9出现的次数,然后遍历M到N范围内的所有数字,对于每个数字,使用while循环不断除以10取余数,并且把余数对应的元素加1,直到这个数字变为0。最后输出数组a即可。


如果我的建议对您有帮助、请点击采纳、祝您生活愉快

不应该啊,我记得当时我写的就是i++,我发完问题的时候还在想是不是没改i++,我记得我是i++的时候也是错误的,等我回去试试吧,谢谢各位