Первая Задачка. Подскажите.

  • Автор темы stasss
  • Дата начала
S

stasss

Гость
#1
Здраствуйте! Учу С++, и нужно решить задачку. Даны целые положительные числа N, a1..., aN. Используя только простые арифметические операции, найти сумму нечетных и произведение четных членов последовательности. Решение понятно, найти четные-нечетные через %2, зациклить суммирование нечетных и произведение четных. Но стал вопрос, как не используя массив работать с N-ным количеством чисел? Спасибо тем кто откликнется!
 
R

rrrFer

Гость
#2
Код:
cin >> n;
for (p = 1, s = 0; 0 > n;) {
cin >> t;
if (1 & t) s += t;
else p *= t;
}
 
S

stasss

Гость
#5
куда-то надо --n добавить
Вот собственно до чего дошел

{int a=0,N=9,/*переменная N может меняться, в зависимости от величины последовательности. В данном примере будут вводиться цифры до 9*/
chet=1,
nechet=0;
{for(a=1;a<=N;a++)
{scanf("%d",&a);
if(a%2==0)
{chet*=a;}
if(a%2>0);
{nechet+=a;}
}

НО. Выдает нереальные числа чет и нечет. По моему ошибка в условии цикла. Не могу додуматься...
 
R

rrrFer

Гость
#6
дошли до полнейшей ерунды.
фигурные скобочки в Си просто так не ставятся, точки с запятыми тоже.
почему мой код не использовали?
 
S

stasss

Гость
#7
дошли до полнейшей ерунды.
фигурные скобочки в Си просто так не ставятся, точки с запятыми тоже.
почему мой код не использовали?
Напомню, это моя первая самостоятельная задача ). Сильно не бейте. Почему не воспользовался? Я поменял имена переменных, и условия цикла. Так как с 0>N, у Вас, я не понял как он будет выполняться. Ведь N>0 в моем случае. А арифметику оставил. И что значит if (1 & t) почему не if(a%2>0) ?
 
R

rrrFer

Гость
#8
C++:
#include <iostream>
int main() {
int n, t, p, s;
std::cin >> n;
for (p = 1, s = 0; 0 < n; --n) {
std::cin >> t;
if (1 & t) s += t;
else p *= t;
}
std::cout << s << " " << p;
std::cin.get(), std::cin.get();
return 0;
}
Так как с 0>N, у Вас, я не понял как он будет выполняться
верно :mellow:

И что значит if (1 & t) почему не if(a%2>0) ?
потому что % - это более сложная операция чем &

Добавлено: по твоему коду:
C++:
{for(a=1;a<=N;a++)
фигурные скобочки просто так не ставятся, почитай зачем они нужны.

Код:
if(a%2==0)
{chet*=a;}
if(a%2>0);
второе условие замени на else. Вычислять выражения a%2 лишний раз не стоит, от этого программа не будет быстрее работать. Кроме того, возможны трудноуловимые баги, если в первом условии значение a изменится (это не к вашей программе, но такое бывает, вцелом, часто)

Код:
if(a%2>0);
про точки с запятой я уже тоже писал, из за нее строка
Код:
{nechet+=a;}
выполняется на каждой итерации цикла.
 
S

stasss

Гость
#9
C++:
#include <iostream>
int main() {
int n, t, p, s;
std::cin >> n;
for (p = 1, s = 0; 0 < n; --n) {
std::cin >> t;
if (1 & t) s += t;
else p *= t;
}
std::cout << s << " " << p;
std::cin.get(), std::cin.get();
return 0;
}

верно :)


потому что % - это более сложная операция чем &

Добавлено: по твоему коду:
C++:
{for(a=1;a<=N;a++)
фигурные скобочки просто так не ставятся, почитай зачем они нужны.

Код:
if(a%2==0)
{chet*=a;}
if(a%2>0);
второе условие замени на else. Вычислять выражения a%2 лишний раз не стоит, от этого программа не будет быстрее работать. Кроме того, возможны трудноуловимые баги, если в первом условии значение a изменится (это не к вашей программе, но такое бывает, вцелом, часто)

Код:
if(a%2>0);
про точки с запятой я уже тоже писал, из за нее строка
Код:
{nechet+=a;}
выполняется на каждой итерации цикла.

Спасибо за подробное разъяснение. Тоесть в { } содержится тело цикла со всеми операциями. А насчет (1 & t) я даже и не знал.


Добавлено:
C++:
#include <iostream>
int main() {
int n, t, p, s;
std::cin >> n;
for (p = 1, s = 0; 0 < n; --n) {
std::cin >> t;
if (1 & t) s += t;
else p *= t;
}
std::cout << s << " " << p;
std::cin.get(), std::cin.get();
return 0;
}

верно :)


потому что % - это более сложная операция чем &

Добавлено: по твоему коду:
C++:
{for(a=1;a<=N;a++)
фигурные скобочки просто так не ставятся, почитай зачем они нужны.

Код:
if(a%2==0)
{chet*=a;}
if(a%2>0);
второе условие замени на else. Вычислять выражения a%2 лишний раз не стоит, от этого программа не будет быстрее работать. Кроме того, возможны трудноуловимые баги, если в первом условии значение a изменится (это не к вашей программе, но такое бывает, вцелом, часто)

Код:
if(a%2>0);
про точки с запятой я уже тоже писал, из за нее строка
Код:
{nechet+=a;}
выполняется на каждой итерации цикла.

Спасибо за подробное разъяснение. Тоесть в { } содержится тело цикла со всеми операциями. А насчет (1 & t) я даже и не знал.
 
R

rrrFer

Гость
#10
Тоесть в { } содержится тело цикла со всеми операциями.{ }
фигурные скобки ограничивают область видимости и иногда их можно для этого поставить без циклом, условий и т.п., но это не ваш случай