Важная информация
Показано с 1 по 8 из 8

Тема: Найти сумму целых положительных чисел из промежутка от А до В, кратных 4 (значения переменных А и В вводятся с клавиатуры).

  1. #1 Найти сумму целых положительных чисел из промежутка от А до В, кратных 4 (значения переменных А и В вводятся с клавиатуры). 
    Новичок
    Регистрация
    09.03.2016
    Сообщений
    1
    Сказал(а) спасибо
    0
    Поблагодарили 1 раз в 1 сообщении
    Найти сумму целых положительных чисел из промежутка от А до В, кратных 4 (значения переменных А и В вводятся с клавиатуры).нужен код
    Ответить с цитированием  
     

  2. Пользователь сказал cпасибо:

    nik_1 (10.03.2016)

  3. #2  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,944
    Сказал(а) спасибо
    1,847
    Поблагодарили 991 раз(а) в 849 сообщениях
    Записей в блоге
    1
    C++ Code:
    1. #include <iostream>
    2.  
    3. using namespace std;
    4.  
    5. int main (int argc, char *argv[])
    6. {
    7. /**  Переменные   **/
    8.    int A, B, Sum = 0;  //  Наши переменные
    9.    int i;              //  Счётчик
    10.  
    11. /**  Ввод данных с клавиатуры   **/
    12. cout << endl << "Vvedi A: ";
    13. cin >> A;
    14.     
    15. cout << "Vvedi B: ";
    16. cin >> B;
    17. cout << endl;   //  Просто на след строку
    18.  
    19. //  Считаем сумму
    20. for (i = A; i < B; i++)
    21.    {
    22.      if ((i % 4 == 0) && (i > 0))
    23.       {
    24.         Sum += i;
    25.         cout << i << endl;
    26.       }
    27.    }
    28.   cout << "Sum = " << Sum << endl;
    29.  
    30.   system("pause");
    31.  
    32.   return 0;
    33. }
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  4. Пользователь сказал cпасибо:

    nik_1 (10.03.2016)

  5. #3  
    Профи Аватар для nik_1
    Регистрация
    03.08.2014
    Сообщений
    283
    Сказал(а) спасибо
    160
    Поблагодарили 145 раз(а) в 109 сообщениях
    Записей в блоге
    1
    не много сделал по другому. организуем проверку A на отрицательное число, если A отрицательное то присвоим ему значение 1. А и В делим на 4, остаток от деления отбрасываем, получаем n1 и n2 - границы цикла. далее в цикле фор от n1 до n2 производим вычисление sum:=sum+n*4;
    Pascal Code:
    1.  
    2. procedure TForm1.Button1Click(Sender: TObject);
    3. var a, b, sum, sum1, n1, n2, n:longint ;
    4.   sError:ansistring;
    5. begin
    6.   memo1.Clear;
    7.   sError:='';
    8.   try
    9.     a:=StrToInt(Edit1.text);
    10.     b:=StrToInt(Edit2.text);
    11.   except
    12.     sError:='data error!';
    13.   end;
    14.   if sError='' then
    15.     begin
    16.       sum:=0;
    17.       if a<0 then a:=1;
    18.       n1:=trunc(a/4);
    19.       n2:=trunc(b/4);
    20.       for n:=n1 to n2 do
    21.         begin
    22.           sum1:=sum;
    23.           sum:=sum+n*4;
    24.           memo1.Lines.Add('n='+IntTostr(n)+':  sum='+IntToStr(sum1)+'+'+IntTostr(n*4)+'='+IntTostr(sum));
    25.         end;
    26.     end
    27.   else memo1.Lines.Add(sError);
    28. end;
    Последний раз редактировалось nik_1; 10.03.2016 в 06:37.
    Ответить с цитированием  
     

  6. Пользователь сказал cпасибо:

    >Quiet Snow< (10.03.2016)

  7. #4  
    Профи Аватар для rrrFer
    Регистрация
    01.08.2013
    Сообщений
    561
    Сказал(а) спасибо
    34
    Поблагодарили 249 раз(а) в 164 сообщениях
    C++ Code:
    1. int a, b, sum = 0;
    2.  
    3. if (a < 0)
    4.   a = 0;
    5.  
    6. while (a%4)
    7.   ++a;
    8.  
    9. while (a < b) {
    10.   sum += a;
    11.   a += 4;
    12. }
    [Ссылки могут видеть только зарегистрированные пользователи. ] // программирование на Prolog, Erlang, C++
    Ответить с цитированием  
     

  8. 2 пользователя(ей) сказали cпасибо:

    >Quiet Snow< (10.03.2016), nik_1 (10.03.2016)

  9. #5  
    Разбирающийся
    Регистрация
    13.10.2013
    Сообщений
    53
    Сказал(а) спасибо
    52
    Поблагодарили 34 раз(а) в 22 сообщениях
    За O(1):
    C Code:
    1. #include <iostream>
    2.  
    3. int main(){
    4. int a, b, sum;
    5. std::cin >> a >> b;
    6. a = a < 0 ? 0 : a;
    7. a = (a >> 2) + (a & 3 ? 1 : 0);
    8. b = b >> 2;
    9. std::cout << ((b - a + 1)*(b + a)) * 2;
    10. }

    Проверял. Вроде работает.
    Ответить с цитированием  
     

  10. 3 пользователя(ей) сказали cпасибо:

    >Quiet Snow< (13.04.2016), Free Admin (13.04.2016), rrrFer (13.04.2016)

  11. #6  
    Профи Аватар для rrrFer
    Регистрация
    01.08.2013
    Сообщений
    561
    Сказал(а) спасибо
    34
    Поблагодарили 249 раз(а) в 164 сообщениях
    Решить задачу за константное время можно и это будет самое правильное решение.
    Я тоже решил, но не так элегантно:
    1) меньшее число (A) "округлил" до ближайшего кратного четырем вверх, а большее (B) - вниз. Т.е. юзер ввел 3, 21 - программа округлила до 4, 20;
    2) если мы напишем функцию sum0N, вычисляющую сумму чисел, кратных четырем от нуля до N - то искомый результат будет
    C Code:
    1. sum0N(B) - sum0N(A) + A
    ;
    3) если мы посмотрим на кратные числа: "4 8 12 16 20", то заметим, что это арифметическая прогрессия, сумму можно вычислить как ((a0 + an)/2)*n;
    4) пишем sum0N: num = N/4 - это количество цифр кратных четырем меньше N, a0 всегда равно 4, an можно получить умножив num на 4:
    C Code:
    1. int sum0N(int val) {
    2.   int n = val/4;
    3.   int an = n*4;
    4.   return ((4+an)/2)*n;


    Можно оптимизировать, вычислив ответ сразу, а не вызывая дважды sum0N - для этого надо подставить округленное значение нижней границы интервала вместо a0.
    Ну а у вас более красивое решение, но ИМХО менее прозрачное. Я понимаю, что сдвиг на 2 - это замена деления на 4, но зачем вы проверяете &3 при "округлении числа"? - как бы, я не уверен, что это на что-то влияет, т.е. было нижнее число 7, но вы интерпретируете его не как 1 (потому что 7/4 = 1), а как 2, т.к. 7&3 = 1. Ну вот этот момент сходу не понятен.
    ЗЫ: понравилось, как от деления на 2 в формуле прогрессии ушли к умножению на 2.
    [Ссылки могут видеть только зарегистрированные пользователи. ] // программирование на Prolog, Erlang, C++
    Ответить с цитированием  
     

  12. 3 пользователя(ей) сказали cпасибо:

    >Quiet Snow< (13.04.2016), Free Admin (13.04.2016), Good.Morning (13.04.2016)

  13. #7  
    Разбирающийся
    Регистрация
    13.10.2013
    Сообщений
    53
    Сказал(а) спасибо
    52
    Поблагодарили 34 раз(а) в 22 сообщениях
    Цитата Сообщение от rrrFer Посмотреть сообщение
    но ИМХО менее прозрачное
    Да, Вы правы. Я бы даже сказал, что из-за сдвигов оно не совсем правильное (ибо float-ы),
    хотя работать должно быстрее обычного деления.

    Цитата Сообщение от rrrFer Посмотреть сообщение
    но зачем вы проверяете &3 при "округлении числа"?
    Я пытаюсь найти наименьшее кратное 4-ем, большее a. Соответственно, если имею 7, то:
    111(2) -> 1(2) {4/4}. 4 < 7, лишний член прогрессии (4). Нужно добавлять 1, тогда 8 > 7.
    Проверка потому, что если имею 8, то оно и так прекрасно делится:
    1000(2) -> 10(2) {8/4}. 8 = 8. Если добавим еще 1, то пропустим первое значение (8).
    P.S. Как-то не очень доходчиво получилось.


    Цитата Сообщение от rrrFer Посмотреть сообщение
    ушли к умножению на 2
    Спасибо, я старался
    Ответить с цитированием  
     

  14. Пользователь сказал cпасибо:

    >Quiet Snow< (13.04.2016)

  15. #8  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,944
    Сказал(а) спасибо
    1,847
    Поблагодарили 991 раз(а) в 849 сообщениях
    Записей в блоге
    1
    Вот такой аналитики не хватает МНОГИМ программерам, например тем, кто портировал(или, о боже, кодил) Ardour.
    Плюсую от души. Безусловно, знал об этом, просто не стал париться ради студ. задачи. Так что молотки парни!
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 4
    Последнее сообщение: 26.05.2014, 17:52
  2. Заполнение массива button массивом целых чисел
    от Игорь Левин в разделе Delphi
    Ответов: 4
    Последнее сообщение: 10.06.2013, 17:06
  3. Ответов: 0
    Последнее сообщение: 21.12.2011, 17:10
  4. Ответов: 2
    Последнее сообщение: 19.05.2011, 22:05
  5. Ответов: 5
    Последнее сообщение: 17.01.2011, 15:54
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •