Операторы цикла найти сумму целых чисел
Цикл For. Блок 1. Вычисление сумм и произведений.
Задача A. Сумма квадратов
По данному натуральному n вычислите сумму 12+22+…+n2.
- int n, s = 0;
- cin >> n;
- for(int i = 1 ; i <= n ; i++)
- s += i*i;
- cout << s;
* This source code was highlighted with Source Code Highlighter.
Задача C. Факториал
Вычислите N! (“эн-факториал”) – произведение всех натуральных чисел от 1 до N ( N!=1∙2∙3∙…∙ N ).
N – натуральное, не превосходит 12.
- int n, nf = 1;
- cin >> n;
- for(int i = 2 ; i <= n ; i++)
- nf *= i;
- cout << nf;
* This source code was highlighted with Source Code Highlighter.
Задача D. Степень
Выведите число 2 N. N не превосходит 30.
- const int count = 2;
- int n, rez = 1;
- cin >> n;
- for(int i = 1 ; i <= n ; i++)
- rez *= count;
- cout << rez;
* This source code was highlighted with Source Code Highlighter.
Этот вариант использует циклы и более прозрачен. При чем заведенная константа позволяет вычислять степени любого основания, следует лишь дать другое значение константе count.
Однако, если речь идет конкретно об основании 2, добиться того же эффекта можно проще, не прибегая к циклам, методом побитового сдвига.
- int n;
- cin>>n;
- cout<<(1<<n);
* This source code was highlighted with Source Code Highlighter.
Задача E. Число сочетаний
По данным натуральным n и k вычислите значение Cnk = n! / (k!(n-k)!) (число сочетаний из n элементов по k).
- long long n,k;
- cin>>n>>k;
- long long res = 1;
- for (int i=1;i<=k;i++)
- {
- res *= (n-k+i);
- res /= i;
- }
- cout<<res;
* This source code was highlighted with Source Code Highlighter.
Задача G. Геометрическая прогрессия
По данному действительному числу a и натуральному n вычислите сумму 1+a+a2+…+an, не используя формулу суммы геометрической прогрессии. Время работы программы должно быть пропорционально n.
- double a;
- int n;
- cin >> a >> n;
- double sum = 1 , an = 1;
- for( int i = 1 ; i <= n ; i++)
- {
- an *= a;
- sum += an;
- }
- f(“%0.8f”,sum);
* This source code was highlighted with Source Code Highlighter.
Задача H. Сумма – 1
По данному числу n вычислите сумму 1+1/22+1/32+…+1/n2. Вводится одно число n, не превосходящее 100000.
- int n;
- cin >> n;
- double sum = 0;
- for( long long i = 1 ; i <= n ; i++)
- sum += 1.0/(i*i);
- f(“%0.8f”,sum);
* This source code was highlighted with Source Code Highlighter.
Задача I. Сумма – 2
По данному числу n вычислите сумму 4(1-1/3+1/5-1/7+…+(-1)n/(2n+1)). Вводится одно число n, не превосходящее 100000.
- int n;
- cin >> n;
- double sum = 1.0;
- int = -1;
- for(int i = 1 ; i <= n ; i++) {
- sum += / ( 2.0 * i + 1 );
- = -;
- }
- f(“%0.8f”, 4 * sum);
* This source code was highlighted with Source Code Highlighter.
Задача J. Сумма степеней
Вычислите 1+2+22+23+…+2N. N – натуральное, не превосходит 30.
- const int osn = 2;
- int n;
- cin >> n;
- int step = 1, sum = 1;
- for( int i = 1 ; i <= n ; i++)
- {
- step *= osn;
- sum += step;
- }
- cout << sum;
* This source code was highlighted with Source Code Highlighter.
Такой вариант хорош, если предполагается вычислять степени произвольных оснований. Для этого под основание завели константу, которую при желании можно изменить. В данном случае osn = 2
Однако, если задача требует лишь конкретное решение для основания 2, то можно поступить проще и воспользоваться побитовым сдвигом, который и даст нам нужный результат.
- int n;
- cin >> n;
- int step = 1, sum = 1;
- for( int i = 1 ; i <= n ; i++)
- {
- step <<= 1;
- sum += step;
- }
- cout << sum;
* This source code was highlighted with Source Code Highlighter.
Задача K. 1/0!+1/1!+1/2!+…
По данному натуральному числу N найдите сумму чисел 1+1/1!+1/2!+1/3!+…+1/N!. Количество действий должно быть пропорционально N.
- int n;
- cin >> n;
- int step = 1, sum = 1;
- for( int i = 1 ; i <= n ; i++)
- {
- step <<= 1;
- sum += step;
- }
- cout << sum;
* This source code was highlighted with Source Code Highlighter.
Источник
На занятии изучается алгоритм работы с циклом с предусловием While в Паскале, рассмотривается пример возведения в степень
While в Паскале – цикл с предусловием
Пример: Определить количество цифр в введенном целом числе, не превышающем 2000000.
Алгоритм: Отделяем и удаляем последовательно последнюю цифру, наращивая счетчик.
n | счетчик |
246 | |
24 | 1 |
2 | 2 |
3 |
В чем сложность?: Заранее не определено и неизвестно, сколько цифр нужно убрать, т.е. сколько шагов необходимо сделать.
Как выполнить: Надо перестать отделять цифры, когда n = 0, т.е. надо выполнять пока n > 0
Блок-схема решения:
Блок-схема решения
Решение примера на Паскале:
Цикл while в Паскале применяется для создания повторений с неизвестным заранее их числом. Повторения (итерации) будут осуществляться, пока истинно некоторое условие.
Блок-схема, соответствующая циклу while в Паскале:
while условие do {Пока условие истинно выполняется оператор} оператор;
- Здесь оператор, стоящий после служебного слова do, образует тело цикла и будет выполняться, пока значение “условия” равно true (истина).
- Если операторов должно быть несколько, тогда необходимо применять составной оператор.
- Условие пересчитывается каждый раз при входе в цикл.
- Непосредственно условием цикла while может быть переменная или логическое выражение.
- Операторы тела цикла while выполнятся только в том случае, если условие будет истинно, если условие ложно – они игнорируются, и программа продолжается с тех операторов, которые стоят уже после конструкции. Таким образом, это существенное отличие цикла с предусловием от цикла с постусловием.
Рассмотрим использование цикла while в Паскале на решенном примере:
Пример: Печатать «ноль» указанное количество раз
Показать решение:
1 2 3 4 5 6 7 8 9 10 | var i,n:integer; begin write (‘kolichestvo znakov’); readln(n); i:=1; while i<=n do begin {составной оператор} write(0); i:=i+1 end; end. |
Задача 3. Ввести целое число и найти сумму его цифр.
Пример:
Введите целое число: 1234 Сумма цифр числа 1234 равна 10.
- Можно использовать сложные условия:
Задача 4. Вычислять с использованием цикла while квадратные корни из чисел 900, 893, 886, 879 и т.д. до тех пор, пока это можно делать.
Детальный разбор работы цикла While в Паскале рассмотрен в видеоуроке:
Пример: найти сумму всех элементов последовательности:
которые по модулю больше 0,001:
Алгоритм:
Блок-схема решения:
Блок-схема решения
Решение на Паскале:
Решение на Паскале
Задача 5: Вычислить сумму элементов следующей последовательности с точностью 0,001:
Результат: S = 1.157
Вложенные циклы в Паскале
Существует возможность использования вложенных циклов в Паскале, когда в теле одного цикла вместо оператора стоит другой цикл.
Важно: Главным обстоятельством во вложенных циклах является использование разных переменных для счетчиков внутреннего и внешнего циклов
Рассмотрим пример:
Пример: Вывести таблицу умножения, используя вложенные циклы в паскале.
Показать решение:
1 2 3 4 5 6 7 8 9 10 const n = 9; {размер таблицы} var i, j :integer; begin for i:=1 to n do {номера строк} begin for j:=1 to n do {номера столбцов} write(i*j:4); writeln; {переход на новую строку} end; end. Произведение в Паскале
Точно также, как существует сумматор для сложения, для умножения в паскале тоже существует специальная конструкция:
Произведение вычисляется по рекуррентному выражению:
P=P*Y,
где P – промежуточные произведения
Y – сомножители
Рассмотрим пример вычисления факториала числа в Паскале с использованием цикла while.
Пример цикла While в Паскале для вычисления факториала 10! (10!=1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10)
1 2 3 4 5 6 7 8 9 10 11 12 var fact, n : integer; begin fact := 1; {начальное значение факториала =0! } n := 1; {начальное значение для условия } while n<=10 do {условие } begin {начало тела конструкции с составным оператором } fact := fact*n; {вычисление факториала n! } n := n + 1 {n должно меняться в теле конструкции} end; {конец тела цикла } writeln(’10!= ‘,fact); {вывод результата расчета } end. Здесь необходимо обратить внимание на то, что присваивание n := 1 стоит до цикла, если этого не сделать, то условие будет работать некорректно, так как переменная n будет пуста.
Программа возведения в степень числа в Паскале
Для начала уточним, что есть формула вычисления степени на Паскале. Но мы не будем ее использовать, а разберем алгоритм решения задачи возведения в степень.
Для того чтобы возвести число в степень, его надо умножить само на себя ровно столько раз, чему равен показатель степени.
Таким образом, возведение числа n в степень d можно выразить так:
nd = n1 * n2 * n3 * … * nd, где нижние индексы просто указывают очередное по счету число n.
Еще необходимо учесть следующее:
- число в нулевой степени равняется 1
- если показатель степени отрицателен, т.е. d , то задача решается по формуле:
nd = 1 / (n1 * n2 * n3 * … * nd)
Т.е., решая программу на Паскале, учитываем:
- в программе на языке Паскаль количество итераций (повторений) цикла while должно быть равно показателю степени числа по модулю;
- если показатель степени – отрицательное число, то нужно впоследствии единицу разделить на результат.
Задача 6. Вычислить в Паскале степень числа, используя цикл while.
Задача 7. Дана последовательность вещественных чисел, признак завершения которой – число 0 (оно не считается элементом последовательности). Найти сумму всех положительных элементов этой последовательности.
Пример результата:
Введите член последовательности 4 Введите член последовательности -1 Введите член последовательности 5 Введите член последовательности 7 Введите член последовательности 0 Сумма положительных чисел = 16
Источник
Нахождение суммы чисел
Постановка задачи. Найти сумму всех целых чисел от n_min до n_max.
Вариант решения 1. Взять n_min – наименьшее число, к нему прибавить следующее, и так далее – до n_max.
Обсуждение 1. Тогда для вычисления суммы чисел от 1 до 100 необходимо выполнить 99 операций сложения или около 10 минут, если одну операцию сложения вы будете в уме выполнять за 6 секунд. Попробуйте выполнить такие действия в уме с секундомером. Но если таких чисел у вас 1 млрд = 109, тогда вам понадобится чуть более 30 лет без сна и отдыха.
Реализация 1. Вы скажете, это работа для компьютера и напишите программу, реализующую принципы структурного программирования:
1) оператор goto нам не нужен:
2) будем использовать только две конструкции: последовательность и цикл;
3) программу представим как последовательность блоков: ввод, сумма, вывод; цикл суммирования является вложенным в блок сумма;
4) выделим три подпрограммы (метода класса Program), назовем их именами блоков: ввод(), сумма1(), вывод(). Для ввода данных и вывода результата воспользуемся методами классов Console и Convert. При необходимости используем и другие конструкции;
5) блок в операторе цикла выделять с помощью { } не обязательно, так как он состоит из одного оператора. Перед циклом сумматор sum следует обнулить. Затем в цикле последовательно добавлять к сумматору следующее число.
6) принцип один вход – один выход для каждого блока соблюдается;
7) принцип сверху-вниз также соблюдается, сначала выделим три блока в методе Main(), затем наполним их операторами.
Дополнительно выберем тип int для всех переменных (пока, чтобы было с чего начать). Три поля и четыре метода класса Program объявим статическими (ic, подробности – в статье). Тогда программа будет выглядеть так:
// Сумма чисел от мин до макс using System; namespace Сумма_чисел { class Program { ic int n_min, n_max; ic int sum; ic void Main(string[] args) { ввод(); сумма1(); вывод(“Сумма чисел через цикл = “); Console.ReadKey(); } ic void ввод() { Console.Write(“начальное число = “); n_min = Convert.ToInt32(Console.ReadLine()); Console.Write(“конечное число = “); n_max = Convert.ToInt32(Console.ReadLine()); } ic void сумма1() { sum = 0; for (int i = n_min; i <= n_max; i++) sum = sum + i; } ic void вывод(string z) { z = z + sum.ToString(); Console.WriteLine(z); } } }
Выполним суммирование чисел от 1 до 100:
Проверим работу программы на других данных, для чего используем следующие тесты (о технологии тестирования читайте отдельно) и выполним тестирование:
Номер теста | Начальное число | Конечное число | Сумма – ожидаемый результат | Сумма – фактический результат |
1 | 1 | 100 | 5050 | 5050 |
2 | 1 | 101 | 5151 | 5151 |
3 | 100 | 1 | 5050 | |
4 | 10 | 10 | 10 | 10 |
5 | 1 | 60000 | 1800030000 | 1800030000 |
6 | 1 | 70000 | 2450035000 | -1844932296 |
7 | 1 | 1000000000 | 500000000500000000 | -243309312 |
8 | R | – | Неверные данные | Необработанное исключение: «Входная строка имеет неверный формат» |
Как мы видим, тесты 1,2,4,5 дают ожидаемый результат, на тестах 3,6,7 обнаруживаются ошибки. На тесте 8 возникает необработанное исключение.
Тест 3 показал (сравните с тестом 1), что если начальное число больше конечного, то суммирование не производится. В отличие от компьютера, который данные и команды воспринимает буквально, человек поймет, что сумма чисел от 1 до 100 всегда равна сумме чисел от 100 до 1:
1+2+…+99+100=100+99+…+2+1 .
Поэтому в метод ввод() добавим проверку условия n_min > n_max.. И, если оно истинно, выполним перестановку, используя локальную переменную p. Это самый простой алгоритм перестановки:
int p; if (n_min > n_max) { p = n_min; n_min = n_max; n_max = p; }
Выполним тест 3, а также снова тесты 1, 2, 4 (изменения в программе могут приводить к появлению других ошибок), убедимся в правильности нашей корректировки.
Примечание: Обратите внимание на алгоритм перестановки, использующий дополнительную переменную и сокращенный условный оператор (только ветка if). Если условие истинно, то выполняется блок из трех операторов присваивания, заключенных в фигурные скобки. Если условие ложно, то перестановка не выполняется. Таким образом, при вводе любых двух целых чисел результатом выполнения метода ввод() будет пара чисел: n_min <= n_max.
Какие еще полезные знания можно извлечь из анализа результатов тестирования? Главное – действовать, а не сидеть сложа руки.
Сравним теперь результаты тестов 5 и 6. Может ли сумма положительных чисел от 1 до 70000 быть отрицательной? В первом тесте сумма примерно равна 1,8·109, во втором ожидаемый результат 2,45·109.
Вспомним, что тип int в C# задается структурой, у которой есть некоторое свойство, например, Int32.MaxValue. Выполним оператор:
Console.WriteLine(int.MaxValue);
Будет выведено число 2147483647, примерно равное 2,15·109. То есть:
1,8·109 < 2,15·109 < 2,45·109.
Это означает, что сумма чисел от 1 до 70000 превышает максимальное число типа int (System.Int32), происходит переполнение, которое никак не диагностируется, что приводит к неправильному результату.
Пример размышлений начинающего программиста: Каждый тип данных имеет минимальные и максимальные допустимые значения. Например, тип int занимает 4 байта (32 бита), причем один из битов используется под знак. Следовательно, максимальное число будет равно 231-1=2147483647. Аналогично, число типа long (Int64) занимает 8 байт (64 бита), из них – 1 бит под знак числа. Тогда максимальное число этого типа равно:
263 – 1 = 9223372035854775807, примерно 9,2·1018.
Если все дело в типе данных, то давайте заменим тип переменной sum с int на long в классе Program:
ic long sum;
Заново выполним тестирование для тестов 1-8. В первых семи тестах получим ожидаемый результат, так как переполнения не происходит.
Добавьте тесты 9 (от 1 до 2·109 ) и 10 (от 1 до 3·109). Объясните результаты. Заметим, что на тесте 9 возникает уже заметная задержка в получении результата – несколько секунд (у меня – 5с).
Попробуем разобраться с тестом 8. Пользователь вашей программы иногда делает ошибки при вводе данных, поэтому можно предусмотреть обработку ошибок некоторым общим образом. Используем оператор try-catch. Оператор try-catch состоит из блока try, за которым следует одно или несколько предложений catch, задающих обработчики для различных исключений. Тогда метод ввод() будет содержать несколько больше операторов:
ic void ввод() { try { Console.Write(“начальное число = “); n_min = Convert.ToInt32(Console.ReadLine()); Console.Write(“конечное число = “); n_max = Convert.ToInt32(Console.ReadLine()); int p; if (n_min > n_max) { p = n_min; n_min = n_max; n_max = p; } } catch { Console.WriteLine(“недопустимый формат числа”); } }
Примечание. Этот пример демонстрирует пользу структурного подхода. Мы изменили только метод ввод() без изменения структуры программы.
Выполните тестирование (тесты 1-10), проанализируйте результаты. Теперь реакция на недопустимый формат числа более адекватная.
Другой взгляд на задачу суммирования
А теперь, еще раз обратимся к постановке задачи «Найти сумму всех целых чисел от n_min до n_max».
Будущий великий математик Карл Фридрих Гаусс (1777-1855гг.), будучи в младшей школе, решил эту задачу (от 1 до 100), заданную на уроке учителем, за несколько секунд. Гауссу быстро удалось понять, что все крайние числа в паре составляют 101, и за считанные секунды он решил это уравнение, умножив 101 на 50. Отсюда следует и общий алгоритм:
Вариант решения 2. Найти алгебраическое выражение для суммы арифметической прогрессии (надеюсь, вы знаете, что это такое, если нет – посмотрите в Интернете) от n_min до n_max с шагом 1.
Обсуждение 2. Тогда для вычисления суммы от 1 до 1 млрд = 109 вам не понадобится 30 лет без сна и отдыха, а время, затрачиваемое на вычисления, не зависит от исходных данных и будет очень малым.
Реализация 2. Вы скажете, это работа даже не для компьютера и выведите формулу:
sum = (n_min + n_max)(n_max – n_min + 1) / 2.
Подставьте в нее числа 1 и 100, получите 5050, 1 и 101, получите 5151.
Все таки добавим еще один метод, использующий вычисление по формуле:
ic void сумма2() { sum = (long)(n_min + n_max) *(long) (n_max – n_min + 1) / 2; }
Операции приведения типов (расширяющее преобразование) используются для снижения риска переполнения. Уберите (long) и исследуйте, что произойдет с тестами.
Для сравнения результатов добавим два оператора в метод Main(), тогда:
ic void Main(string[] args) { ввод(); сумма1(); вывод(“Сумма чисел через цикл = “); сумма2(); вывод(“Сумма чисел через формулу = “); Console.ReadKey(); }
Отметим, что структура метода Main() – последовательность. Метод вывод() мы используем дважды, а ее строковый параметр служит для смены заголовков.
Вот пример выполнения окончательного варианта программы:
Конец обсуждения задачи 1.1
Программистский фольклор: «Формула лучше алгоритма».
Следующий пример: Вычисление sin(x).
Источник
Цикл For. Блок 2. Задачи на цикл For.
Задача A. Четные числа
Выведите (через пробел) все четные числа от a до b (включительно).
- int a, b ;
- cin >> a >> b;
- for (int i = a; i <= b; i++)
- if (i % 2 == 0)
- cout << i << ‘ ‘;
* This source code was highlighted with Source Code Highlighter.
Задача B. Остаток
Вводятся 4 числа: a, b, c и d.
Выведите все числа на отрезке от a до b, дающие остаток c при делении на d.
- int a, b, c, d ;
- cin >> a >> b >> c >> d;
- for (int i = a ; i <= b ; i++)
- if (i % d == c)
- cout << i << ‘ ‘;
* This source code was highlighted with Source Code Highlighter.
Задача C. Квадраты
Выведите все числа на отрезке от a до b, являющиеся полными квадратами.
Вариант 1.
- int a , b;
- cin >> a >> b ;
- int sqrt_a = ceil(sqrt(a + 0.0));
- int sqrt_b = sqrt((double)b);
- for (int i = sqrt_a ; i <= sqrt_b ; i++)
- cout << i*i << ” “;
* This source code was highlighted with Source Code Highlighter.
В этом случае мы рационально движемся от sqrt(a) к sqrt(b), т.к. проверка меньших и больших значений смысла не имеет.
Нужно обратить внимание, что корень от а округляется в большую сторону ceil(sqrt(a + 0.0) перед отправкой в цикл: если а – и есть полный квадрат, то это число также должно быть выведено, однако, если а дает дробный корень, то его целая часть (при приведении к типу int) даст заведомо меньший квадрат, чем значение а. Поэтому мы заранее округляем sqrt(a) до следующего целого числа, дабы избежать выведение лишнего квадрата.
Варинат 2.
Этот вариант реализации менее рациональный, однако более прозрачный. Мы напрямую движемся от а до b c проверкой полноты квадрата каждого из текущих значений.
- int a,b;
- cin>>a>>b;
- for (int i=a;i<=b;i++)
- {
- int Sqrt = sqrt((double)i);
- if ( Sqrt*Sqrt == i)
- cout<<i<<‘ ‘;
- }
* This source code was highlighted with Source Code Highlighter.
Задача H. Делители числа
Выведите все натуральные делители числа x в порядке возрастания (включая 1 и само число).
- int x;
- cin >> x;
- for (int i = 1 ; i <= x ; i++)
- if ( x % i == 0 )
- cout << i << ‘ ‘;
* This source code was highlighted with Source Code Highlighter.
Задача I. Количество делителей
Подсчитайте количество натуральных делителей числа x (включая 1 и само число; x <= 30000).
- int x, k = 0;
- cin >> x;
- for (int i = 1; i <= x; i++)
- if (x % i == 0 )
- k++;
- cout << k;
* This source code was highlighted with Source Code Highlighter.
Задача J. Сумма ста
Вычислите сумму данных 100 натуральных чисел. Вводятся 100 чисел, сумму которых необходимо посчитать.
- int x;
- long long sum = 0;
- for (int i = 1; i <= 100; i++)
- {
- cin >> x;
- sum += x;
- }
- cout << sum ;
* This source code was highlighted with Source Code Highlighter.
Задача K. Сумма чисел
Вычислите сумму данных N натуральных чисел. Вводится число N, а затем N чисел, сумму которых необходимо вычислить.
- int n, x;
- long long sum = 0;
- cin >> n;
- for (int i = 1; i <= n; i++)
- {
- cin >> x;
- sum += x;
- }
- cout << sum ;
* This source code was highlighted with Source Code Highlighter.
Задача M. Нули
Вводится число N, а затем N чисел. Подсчитайте, сколько среди данных N чисел нулей.
- int n , x , k = 0;
- cin >> n;
- for (int i = 1; i <= n ; i++)
- {
- cin >> x;
- if (x == 0)
- k++;
- }
- cout << k;
* This source code was highlighted with Source Code Highlighter.
Задача N. Подсчет чисел
Подсчитайте, сколько среди данных N чисел нулей, положительных чисел, отрицательных чисел. Вводится число N, а затем N чисел. Необходимо вывести сначала число нулей, затем число положительных и отрицательных чисел.
Вариант 1.
- int n, x;
- int zero = 0, pos = 0, neg = 0;
- cin >> n;
- for (int i = 1; i <= n ; i++)
- {
- cin >> x;
- if (x == 0) zero++;
- else if (x > 0) pos++;
- else neg++;
- }
- cout<<zero<<‘ ‘<<pos<<‘ ‘<<neg;
* This source code was highlighted with Source Code Highlighter.
При данной реализации мы каждый раз в цикле прогоняем последовательную проверку числа на знак. Сейчас это не доставляет никаких неудобств, т.к. мы имеем всего 3 критерия подсчета. Однако, если б требовалась более широкая проверка, например, относительно 10-ти различных случаев, то рациональнее было бы использовать сase-структуру. Что и сделано в варианте 2
Вариант 2.
Используем сase-структуру для определения знака, предварительно нормировав ненулевые значения в единицу (1/-1).
- int n, x;
- int zero = 0, pos = 0, neg = 0;
- cin >> n;
- for (int i = 1; i <= n ; i++)
- {
- cin >> x;
- if (x)
- x /= abs(x);
- switch(x)
- {
- case 1: pos++; break;
- case 0: zero++; break;
- case -1: neg++; break;
- }
- }
- cout<<zero<<‘ ‘<<pos<<‘ ‘<<neg;
* This source code was highlighted with Source Code Highlighter.
Задача O. Ноль или не ноль
Проверьте, есть ли среди данных N чисел нули. Вводится число N, а затем N чисел. Выведите YES, если среди введенных чисел есть хотя бы один нуль, или NO в противном случае.
Вариант 1.
- int x, n;
- cin >> n;
- bool zeroExist = false;
- for (int i = 1; i <= n ; i++)
- {
- cin >> x;
- if (x == 0)
- {
- zeroExist = true;
- break;
- }
- }
- if (zeroExist)
- cout<<“YES”;
- else
- cout << “NO”;
This source code was highlighted with Source Code Highlighter.
Вариант 2.
Ту же самую идею можно описать короче.
- int x, n;
- cin >> n;
- bool zeroExist = false;
- for (int i = 1; i <= n ; i++)
- {
- cin >> x;
- zeroExist = zeroExist | (x == 0);
- if (zeroExist)
- break;
- }
- cout<<(zeroExist ? “YES” : “NO”);
* This source code was highlighted with Source Code Highlighter.
Задача P. Уравнение по возрастанию
Вводятся 4 числа: a, b, c и d.
Найдите все целые решения уравнения ax3 + bx2 + cx + d = 0 на отрезке [0,1000] и выведите их в порядке возрастания.
- long long a , b , c , d ;
- cin >> a >> b >> c >> d;
- for (int i = 0; i <= 1000 ; i++)
- if ( a*i*i*i + b*i*i + c*i + d == 0)
- cout<< i <<‘ ‘;
* This source code was highlighted with Source Code Highlighter.
Задача Q. Уравнение по убыванию
Вводятся 4 числа: a, b, c и d.
Найдите все целые решения уравнения ax3 + bx2 + cx + d = 0 на отрезке [0,1000] и выведите их в порядке убывания.
- long long a, b, c, d;
- cin >> a >> b >> c >> d;
- for (int i = 1000; i >= 0; i–)
- if (a*i*i*i + b*i*i + c*i + d == 0)
- cout << i <<‘ ‘;
* This source code was highlighted with Source Code Highlighter.
Задача R. Количество решений
Вводятся 5 чисел: a, b, c, d и e.
Найдите все целые решения уравнения ( ax3 + bx2 + cx + d ) / ( x – e ) = 0 на отрезке [0,1000] и выведите их количество.
- long long a, b, c, d, e;
- cin >> a >> b >> c >> d >> e ;
- int k = 0;
- for (int i = 0; i <= 1000; i++ )
- if (a*i*i*i + b*i*i + c*i + d == 0)
- if (i – e != 0)
- k++;
- cout << k ;
* This source code was highlighted with Source Code Highlighter.
Задача S. ГНЧЭ-1
“ГНЧЭ-1” – сложное электронное устройство, выдающее каждую секунду очередное число последовательности 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5… Ввиду дороговизны электронных комплектующих вам поручено разработать эмулятор для этого устройства.
Дано количество секунд (от 1 до 1000000), которые работает генератор после включения. Вывести результат работы генератора
Вариант 1.
При таком варианте реализации мы печатаем столько раз текущее значение cur сколько оно само обозначает count , после чего обнуляем подсчет одинаковых выводов count и переходим на следующее текущее значение cur и т.д.
- int n;
- cin >> n;
- int cur = 1 , count = 0;
- for (int i = 1; i <= n; i++)
- {
- cout<< cur <<‘ ‘;
- count++;
- if (cur == count)
- {
- cur++;
- count = 0;
- }
- }
* This source code was highlighted with Source Code Highlighter.
Вариант 2.
В этом варианте решения идея та же. Однако контроль за количеством отработанных секунд и количеством напечатанных текущих значений возложены на два отдельных цикла.
Итак, здесь мы ведем подсчет напечатанных позиций pos , которых должно быть ровно столько же, сколько секунд работает машина. А внутренним циклом задаем печать текущего числа cur . Проверка условия if (pos == n) не даст задержаться во внутреннем цикле дольше положенных секунд.
- int n;
- cin >> n;
- int pos = 0, cur = 1;
- for ( ; pos < n ; )
- {
- for (int i = 0; i < cur; i++)
- {
- f(“%d “, cur);
- pos++;
- if (pos == n)
- break;
- }
- cur++;
- }
* This source code was highlighted with Source Code Highlighter.
Источник