C ++ - Подсчет цифр диапазона чисел - PullRequest
0 голосов
/ 10 марта 2019

Что мне нужно сделать:

Программа, в которой пользователь вводит диапазон чисел от S до K . Он должен подсчитать, сколько раз цифра найдена среди чисел, и, наконец, распечатать их в следующем порядке: 0 1 2 3 4 5 6 7 8 9.

Мой код:

OBS: Он не работает для цифр больше 10.

#include <iostream>

using namespace std;

int main()
{
int S, K;
cin >> S >> K;
int digits = 0;
int dig0 = 0;
int dig1 = 0;
int dig2 = 0;
int dig3 = 0;
int dig4 = 0;
int dig5 = 0;
int dig6 = 0;
int dig7 = 0;
int dig8 = 0;
int dig9 = 0;
int remainder = 0;

for (int i = S; i <= K; i++) {
    if (i < 10) {
        switch(i) {
        case 0:
            dig0++;
            break;
        case 1:
            dig1++;
            break;
        case 2:
            dig2++;
            break;
        case 3:
            dig3++;
            break;
        case 4:
            dig4++;
            break;
        case 5:
            dig5++;
            break;
        case 6:
            dig6++;
            break;
        case 7:
            dig7++;
            break;
        case 8:
            dig8++;
            break;
        case 9:
            dig9++;
            break;
        }
    } else if (i >= 10) {
        while (i > 0) {
            remainder = i % 10;
            switch(remainder) {
            case 0:
                dig0++;
                break;
            case 1:
                dig1++;
                break;
            case 2:
                dig2++;
                break;
            case 3:
                dig3++;
                break;
            case 4:
                dig4++;
                break;
            case 5:
                dig5++;
                break;
            case 6:
                dig6++;
                break;
            case 7:
                dig7++;
                break;
            case 8:
                dig8++;
                break;
            case 9:
                dig9++;
                break;
            }
            i /= 10;
        }
    }
}

cout << dig0 << ' ' << dig1 << ' ' << dig2 
<< ' ' << dig3 << ' ' << dig4 << ' ' << dig5 
<< ' ' << dig6 << ' ' << dig7 << ' ' << dig8 << ' ' << dig9;

return 0;
}

Желаемое поведение:

Контрольный пример 01

Ввод: от 1 до 9

Вывод: 0 1 1 1 1 1 1 1 1 1 (Поскольку есть 0 цифр 0 и 1 цифра каждого числа от 1 до 9)

Контрольный пример 02

Ввод: 767 772

Вывод: 1 1 1 0 0 0 3 10 1 1

Ответы [ 2 ]

2 голосов
/ 10 марта 2019

(изменить, чтобы разрешить любые значения для S и K, включая отрицательные)

Может быть

#include <iostream>
using namespace std;

int main()
{
  int S, K;
  int dig[10] = { 0 };

  if (!(cin >> S >> K))
    return -1;

  if (S > K)
    swap(S, K);

  for (auto i = S; i <= K; ++i) {
    auto v = i;

    do {
      dig[abs(v % 10)] += 1;
      v /= 10;
    } while (v != 0);
  }

  for (auto v : dig)
    cout << v << ' ';
  cout << endl;

  return 0;
}

Я внес некоторые изменения в ваше предложение

  • исправление состоит в том, чтобы i не изменился во внутреннем , в то время как с использованием другой переменной.
  • Я проверяю, что два действительных значения вводятся (if (!(cin >> S >> K)) ...)
  • При необходимости я обмениваю S и K, чтобы получить S <= K, потому что это предположение в <em>для ниже
  • Я использую массив вместо dig0 dig1 ... dig9, этоГораздо проще с массивом
  • Управляю отрицательными значениями.Заметьте, что я делаю int v = i; ... dig[abs(v % 10)] += 1; вместо int v = abs(i); ... dig[v % 10] += 1; для управления случаем, когда v равно INT_MIN (-INT_MIN равно INT_MIN, поэтому все еще отрицательно при использовании дополнения до 2)

Компиляция иказни:

pi@raspberrypi:/tmp $ g++ -pedantic -Wextra m.cc
pi@raspberrypi:/tmp $ ./a.out
1 9
0 1 1 1 1 1 1 1 1 1 
pi@raspberrypi:/tmp $ ./a.out
767 772
1 1 1 0 0 0 3 10 1 1 
pi@raspberrypi:/tmp $ ./a.out
-1 1
1 2 0 0 0 0 0 0 0 0 
pi@raspberrypi:/tmp $ ./a.out
-767 -772
1 1 1 0 0 0 3 10 1 1 

Дополнительное примечание: если auto помешает вам, замените их на int , а for (auto v : dig) cout << v << ' '; на for (int i = 0; i != 10; ++i) cout << dig[i] << ' ';

0 голосов
/ 10 марта 2019

Использование оператора switch неудобно, и несколько переменных int могут быть объединены в массив.

#include <array>
#include <iostream>

int main() {

    std::array<int, 10> digits = {0};

    int s, k;
    std::cin >> s >> k;

    int temp;
    if(s > k) {//swap s and k, if s > k
        temp = s;
        s = k;
        k = temp;
    }

    for(s; s <= k; s++) {
        temp = s;
        do {
            digits[temp%10]++;
            temp /= 10;
        }while(temp != 0);
    }

    for(int j : digits) {
        std::cout << ' ' << j;
    }

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...