Я делаю онлайн-вызов, и задача заключается в следующем:
«Дети играют в игру под названием« Подсчет цифр ». Для заданных чисел S и K они сначала записывают все числа между этими цифрами, а затем подсчитывают, сколько раз появляется каждая цифра (0,1,2,3,4,5,6). , 7,8,9). Например, S = 767, K = 772, цифры будут: 767,768,769,770,771,772
Итак, 0 покажет один раз (в 770), 1 покажет один раз (в 771) и так далее ..
В основном моя программа должна делать следующее (данный пример):
Входные данные:
1 9
(Это номера 1,2,3,4,5,6,7,8,9)
Выход:
0 1 1 1 1 1 1 1 1 1
(0 не показывает, другие цифры показывают один раз). «
Я застрял в этом коде … из идей.
#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;
}
}
Любой псевдокод / фрагмент / код / подсказка приветствуется.
Чисто численное решение чисто числовой задачи:
#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;
}
Мое решение таково:
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);
}
}
Что вы обычно делаете с такими задачами, это вычисление числа между 0
а также S
и между 0
а также K
и вычитая их.
Сколько между 0
а также 767
? Сначала посчитайте цифры последней цифры. Есть 77
раз 0, 1, 2, 3, 4, 5, 6, 7 каждый и 76
раз 8 и 9. Более формально, 767/10+1
между 0
а также 767%10
а также 767/10+1
на отдыхе. Затем рассчитайте количество вхождений последней цифры для 767/10=76
, умножить на 10
, добавлять 7
раз 7 и 6 (для ошибки на последнем) и сделать то же самое для оставшихся цифр, здесь 76/10=7
, Наконец, добавьте результаты.
Это решает проблему в O(log_10 K)
,
попробуйте этот код:
for(int n=s ; n<=k ; n++)
{
tempN = abs(n);
while(tempN > 0)
{
tempDigit = tempN % 10;
tempN /= 10;
//count tempDigit here
}
}
предполагая, что ваши переменные являются целыми числами, «tempN / = 10;» должно быть никаких проблем.