Domanda

I'm doing an online challenge and the challenge is the following: "Kids are playing a game called "Counting digits". For given numbers S and K, they firstly write all numbers between those numbers and then count how many times each digit appears (0,1,2,3,4,5,6,7,8,9). For example, S=767, K=772, numbers will be: 767,768,769,770,771,772

So, 0 will show once (in 770), 1 will show once (in 771) and so on..

Basically, my program have to do the following (given example):

Input: 1 9 (These are numbers 1,2,3,4,5,6,7,8,9)

Output: 0 1 1 1 1 1 1 1 1 1 (0 doesn't show, other numbers show once)."

I'm stuck on this code... out of ideas.

#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;
        }
    }

Any pseudo code/snippet/code/hint is appreciated.

È stato utile?

Soluzione

Purely numeric solution to a purely numeric problem:

#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;
}

Altri suggerimenti

My solution is like this:

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;
}
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);
    }
}

What you usually do with such tasks is calculating the number between 0 and S and between 0 and K and subtracting those.

How many are between 0 and 767? First count the numbers of the last digit. There are 77 times 0, 1, 2, 3, 4, 5, 6, 7 each and 76 times 8 and 9. More formally, 767/10+1 between 0 and 767%10 and 767/10+1 on the rest. Then calculate the number of occurences of the last digit for 767/10=76, multiply by 10, add 7 times 7 and 6 (for the error on the last one) and do the same for the remaining digits, here 76/10=7. Finally, add the results up.

This solves the problem in O(log_10 K).

try this code:

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

        //count tempDigit here
    }
}

assuming your variables are ints, "tempN /= 10;" should be no problem.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top