C/C++

Всем салют! Ребят где я затупил в коротком коде на С++. Сделайте ревью. Выводит 144 а нужно 168.

Напишите программу, которая в последовательности натуральных чисел определяет сумму всех чисел, кратных 6 и оканчивающихся на 4. Программа получает на вход натуральные числа, количество введённых чисел неизвестно, последовательность чисел заканчивается числом 0 (0 — признак окончания ввода, не входит в последовательность).
Количество чисел не превышает 1000. Введённые числа не превышают 30000.
Sample Input:

24 16 36 144 64 44 0 24 54 84 24

Sample Output:

168

#include
using namespace std;
int main(int argc, char** argv[]){
int n;
cin >> n;
int count= 0, aggregate = 0;
while (n != 0 && aggregate < 1000){
cin >> n;
if (n % 6 == 0 && n % 10 == 4){
count += n;
aggregate++;
n/=10;

}

}
cout << count;
return 0;
}

Test input:
24 16 36 144 64 44 0 24 54 84 24
Test output:
144
cin >> n; //<-- Это введенное число у Вас и пропадает, т. к. не обрабатывается
int count= 0, aggregate = 0;
while (n != 0 && aggregate < 1000){
cin >> n; //<-- Потому, что здесь уже вводится новое n, а старое значение "потерялось".
Именно поэтому разница с ответом у Вас на 24.

n/=10; <= это Вам не нужно

Перепишите цикл с for-break; а первый ввод уберите. Н-р
for(int n;cin>>n && n;) {
if (n % 6 == 0 && n % 10 == 4) count+=n;
}
https://ideone.com/wZkTZi

ЗЫЖ aggregate - скорее всего тоже не нужен. Не более 1000 это Вам гарантируют, что чисел не будет больше 1000, а не то, что Вам надо это проверять.

Кст по смыслу - aggregate ближе к сумме, чем count ;) Но это уже так...
КС
Камиль Сабитов
84 764
Лучший ответ
Денис Половка спасибо, теперь буду знать)
#include <iostream>
using namespace std;
int main() {
int s = 0, n;
while (true) {
cin >> n;
if (!n) break;
if (0 == n % 6 && 4 == n % 10) s += n;
}
cout << s << '\n';
system("pause > nul");
}
GL
Georgii Lubchenko
72 348
помарка - переменные перепутаны местами (код писали не вы)
упущение - ограничение в 30К у вас отсутствует
упущение задания - ограничение только верхнее и не по модулю так что числа -4579531584 вполне могут быть
ошибка - количество [введеных] чисел, а не удовлетворяющих условию
ошибка - вы забираете первое число, затем проверяете его в while и внутри перед проверкой основного условия забираете следующее число

почему никто про реверс-while не вспомнил? впринципе и в обычный можно уложить проверяя cin и n за ним (вроде как в плюcах нету подобия Console.ReadLine() чтобы провернуть что-то типа while((n = Console.ReadLine()) != 0), но зная своё незнание плюсов скорее всего ошибаюсь)

приведу только одну строку, целиковые варианты вам накидали
do { cin >> n; if (n != 0 && n < 30000 && n % 10 == 4 && n % 6 == 0) aggregate += n; } while (n != 0 && ++count < 1000);
Денис Половка код писал я) но спасибо за ремарку и объяснение)
Камиль Сабитов Числа НАТУРАЛЬНЫЕ
Камиль Сабитов Зачем "реверс-while"? Когда можно сделать красиво for?
Тем более можно было сделать ещё изящнее, но были-бы вопросы.
Камиль Сабитов Конечно куча сравнений лучше =) и внутри цикла и в конце цикла....
Камиль Сабитов 30К не упущение. Это ДАНО. Это как постоянная g=9.81 условно.
К слову - если код рассчитывали на отрицательные (хотя по условию числа натуральные) - у меня плохие новости. Остаток от деления отрицательного числа будет отрицательным.
я ничего не знаю в С++, но видно же, что ты теряешь одну из 24, а вот 1 или последнюю - смотри сам
замени одну на 25 и увидишь какую, потом ищи глюк