运行结果错误 感觉是哪个while循环有错误 想问问怎么改

题目背景
Bessie 处于半梦半醒的状态。过了一会儿,她意识到她在数数,不能入睡。

题目描述
Bessie的大脑反应灵敏,仿佛真实地看到了她数过的一个又一个数。她开始注意每一个数码(09):每一个数码在计数的过程中出现过多少次?

给出两个整数 M 和 N

输入格式
第 1 行: 两个用空格分开的整数 M和 N。

输出格式
第 1 行: 十个用空格分开的整数,分别表示数码 09在序列中出现的次数。(从M到N)

输入输出样例
输入 #1复制
129 137
输出 #1复制
1 10 2 9 1 1 1 1 0 1

#include<stdio.h>
int main(){
    int M,N,i,a[10],j,temp,k;
    a[10]={0};
    scanf("%d%d",&M,&N);
    for(i=M;i<=N;i++){
        k=i;
        while(k!=0){
            temp=k%10;
            switch(temp){
            case(0):a[0]++;break;
            case(1):a[1]++;break;
            case(2):a[2]++;break;
            case(3):a[3]++;break;
            case(4):a[4]++;break;
            case(5):a[5]++;break;
            case(6):a[6]++;break;
            case(7):a[7]++;break;
            case(8):a[8]++;break;
            case(9):a[9]++;break;
            }
            k/=10;
        }
    }
    printf("%d %d %d %d %d %d %d %d %d %d",a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
    return 0;
}

#include<stdio.h>
int main(){
    int M,N,i,a[10]={0},j,temp,k;
    scanf("%d%d",&M,&N);
    for(i=M;i<=N;i++){
        k=i;
        while(k!=0){
            temp=k%10;
            switch(temp){
            case(0):a[0]++;break;
            case(1):a[1]++;break;
            case(2):a[2]++;break;
            case(3):a[3]++;break;
            case(4):a[4]++;break;
            case(5):a[5]++;break;
            case(6):a[6]++;break;
            case(7):a[7]++;break;
            case(8):a[8]++;break;
            case(9):a[9]++;break;
            }
            k/=10;
        }
    }
    printf("%d %d %d %d %d %d %d %d %d %d",a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
    return 0;
}

用switch...case干啥啊,直接 a[k%10]++;不香吗?

#include<stdio.h>
int main(){
    int M,N,i,a[10]={0},k;
    scanf("%d%d",&M,&N);
    for(i=M;i<=N;i++){
        k=i;
        while(k!=0){
            a[k%10]++;
            k/=10;
        }
    }
    for(i=0;i<10;i++)
    printf("%d ",a[i]);
    return 0;
}