0

私はオンラインチャレンジを行っています。チャレンジは次のとおりです。「子供たちは「数字を数える」というゲームをプレイしています。与えられた数字SとKについて、最初にそれらの数字の間にすべての数字を書き、次に各数字が現れる回数を数えます。 (0,1,2,3,4,5,6,7,8,9)たとえば、S = 767、K = 772、数字は767,768,769,770,771,772になります。

したがって、0は1回(770で)表示され、1は1回(771で)表示されます。

基本的に、私のプログラムは次のことを行う必要があります(例を示します)。

入力:1 9(これらは数字1、2、3、4、5、6、7、8、9です)

出力:0 1 1 1 1 1 1 1 1 1(0は表示されず、他の数字は1回表示されます)。」

私はこのコードに固執しています...アイデアから。

#include <iostream>

using namespace std;

int main()
{
    int s,k;
    int array[10];
    int c0=0,c1=0,c2=0,c3=0,c4=0,c5=0,c6=0,c7=0,c8=0,c9=0;
    cin >> s >> k;
    int saves = s;
    int savek = k;
    cout << s%10;
    for(int i=s;i<=k;i++)
    {
        int savei=i;
        while(savei!=0)
        {
            savei=savei%10;
        }
    }

疑似コード/スニペット/コード/ヒントをいただければ幸いです。

4

5 に答える 5

2

純粋な数値の問題に対する純粋な数値の解決策:

#include <iostream>

int main()
{
    int s, k, i, tmp;
    std::cin >> s >> k;

    int count[10] = { 0 };

    for (i = s; i <= k; i++) {
        tmp = i;
        do {
            count[tmp % 10]++;
            tmp /= 10;
        } while(tmp);
    }

    for (i = 0; i < 10; i++) {
        std::cout << i << " appears " << count[i] << " times" << std::endl;
    }

    return 0;
}
于 2013-03-02T10:37:51.190 に答える
1

私の解決策は次のようなものです:

int main(){
    int s,k;
    cin >> s >> k;
    int numbers[10]={0};
    string sum;

    for(int i=s;i<=k;i++)
    {
        sum=to_string(i);
        for(int i=0;i<sum.length();i++){
            numbers[(int)sum.at(i)-48]++;
        }
    }

    for(int i=0;i<10;i++){
        cout<<numbers[i]<<endl;
    }

    return 0;
}
于 2013-03-02T10:42:21.610 に答える
1
public static void getDigitsInBook(int n) {
    for(int i=0;i<10;i++) {
        int x = n,val=0,k=1;
        while(x!=0) {
            int left  = x/10;
            int num = x%10;
            int right = n%k;
            if(i == 0) {
                val = val+ (left*k);
            }
            else if(i<num) {
                val = val + ((left+1)*k);
            }
            else if(i==num) {
                val = val + (left*k) + right+1;
            }
            else {
                val = val+ (left*k);
            }
            k=k*10;
            x = n/k;
        }
        System.out.println(val);
    }
}
于 2013-12-11T15:26:35.863 に答える
0

このようなタスクで通常行うことは、との間の数を計算し、0それらS0差し引くKことです。

0との間は767いくつですか?最初に最後の桁の数を数えます。時間はそれぞれ770、1、2、3、4、5、6、7で、76時間は8と9です。より正式には、残りの部分と767/10+1の間0767%10および767/10+1残りの部分です。次に、の最後の桁の出現回数を計算し767/10=76、を掛けて10、7と6の積を加算し(最後の桁7のエラーの場合)、残りの桁についても同じことを行います76/10=7。最後に、結果を合計します。

これにより、の問題が解決されO(log_10 K)ます。

于 2013-03-02T10:31:34.217 に答える
0

このコードを試してください:

for(int n=s ; n<=k ; n++)
{
    tempN = abs(n);
    while(tempN > 0)
    {
        tempDigit = tempN % 10;
        tempN /= 10;

        //count tempDigit here
    }
}

変数がintであると仮定すると、 "tempN / = 10;" 問題ないはずです。

于 2013-03-02T10:38:56.417 に答える