0

特定の数字が整数内に出現する頻度を数えたい。次のコードがあります。

int main()
{
    printf ("Put numbers\n");

    int cislo;
    int s0,s1,s2,s3,s4,s5,s6,s7,s8,s9;

    while(scanf("%d",&cislo)==1){
        if (cislo<0)
            printf ("Cislo %d, je zaporne, takove neberu", cislo);
        continue;
    }

    s0=s1=s2=s3=s4=s5=s6=s7=s8=s9=0;
    do{
        (cislo/=10);
        switch (cislo%10){
            case 0: ++s0; break;
            case 1: ++s1; break;
            case 2: ++s2; break;
            case 3: ++s3; break;
            case 4: ++s4; break;
            case 5: ++s5; break;
            case 6: ++s6; break;
            case 7: ++s7; break;
            case 8: ++s8; break;
            case 9: ++s9; break;
        }
    }while (cislo>0);

    printf ("Zadane cislo se sklada z cislic: \n\n 0 ... %dx \n 1 ... %dx \n 2 ... %dx \n 3 ... %dx \n 4 ... %dx \n 5 ... %dx \n 6 ... %dx \n 7 ... %dx \n 8 ... %dx \n 9 ... %dx \n",s0,s1,s2,s3,s4,s5,s6,s7,s8,s9);

    return 0;
}

どのように機能する必要がありますか:

番号を入力:
1111111111

番号: 1111111111

含む:
0 ... 0x
1 ... 10倍
2 ... 0x
3 ... 0x
4 ... 0x
5 ... 0x
6 ... 0x
7 ... 0x
8 ... 0x
9 ... 0x

実際の仕組み:

番号を入力:
1111111111

番号: 1111111111

含む:
0 ... 1x
1 ... 9倍
2 ... 0x
3 ... 0x
4 ... 0x
5 ... 0x
6 ... 0x
7 ... 0x
8 ... 0x
9 ... 0x

誰かが理由を知っていますか?

4

2 に答える 2

2

をとってから割るmod

 do{
    switch (cislo%10){
    case 0: ++s0; break;
    case 1: ++s1; break;
    case 2: ++s2; break;
    case 3: ++s3; break;
    case 4: ++s4; break;
    case 5: ++s5; break;
    case 6: ++s6; break;
    case 7: ++s7; break;
    case 8: ++s8; break;
    case 9: ++s9; break;
    }
    cislo/=10;
 }while (cislo>0);

このため、数えるときに 1 桁が失われます。

あなたの入力方法はあまり良くありません。したがって、整数を 1 つだけ受け取りたい場合は次のようになります。

while(scanf("%d",&cislo)!=1){

より適切です。

s[10]10 個の整数の代わりに配列を使用することもできます。

于 2012-10-19T20:57:02.113 に答える
0

do/whileループを変更します。

do {
    int nextval = cislo / 10;

    switch (cislo - (nextval*10)) {
        case 0: ++s0; break;
        case 1: ++s1; break;
        case 2: ++s2; break;
        case 3: ++s3; break;
        case 4: ++s4; break;
        case 5: ++s5; break;
        case 6: ++s6; break;
        case 7: ++s7; break;
        case 8: ++s8; break;
        case 9: ++s9; break;
    }

    cislo = nextval;
} while (cislo>0);
于 2012-10-19T20:59:14.140 に答える