(изменить, чтобы разрешить любые значения для 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] << ' ';