Изучаем цикл while на C++

Михаил Попов    05.01.2016 02:04    C++ , Алгоритмы     нет комментариев

Изучаем циклы на C++
Продолжаю осваивать синтаксис языка C++. Решил опубликовать свои решения для кучки задачек на циклы. Благо, задачки оказались "школьные", хотя часть мне показалась довольно интересной. Как раз для школьников их и опубликую. Все решения завернуты и разворачиваются по клику. Надеюсь stepic.org на меня не обидится.

Задача №1

По данному целому числу $%N$% распечатайте все квадраты натуральных чисел, не превосходящие $%N$%, в порядке возрастания.
Формат входных данных
Вводится натуральное число.
Формат выходных данных
Выведите ответ на задачу.

int a, i;
cin >> a;
i = 1;
while (i * i <= a) {
    cout << i * i << " ";
    i = i + 1;
}

Задача №2

Дано целое число, не меньшее 2. Выведите его наименьший натуральный делитель, отличный от 1.
Формат входных данных
Вводится целое положительное число.
Формат выходных данных
Выведите ответ на задачу.

Sample Input:
15
Sample Output:
3
int a, i, nod;
cin >> a;
i = a;
nod = a;
while (i > 1) {
    if (a % i == 0) {
        nod = i;
    }
    i = i - 1;
}
cout << nod;

Задача №3

По данному числу $%N$% распечатайте все целые степени двойки, не превосходящие $%N$%, в порядке возрастания.
Формат входных данных
Вводится натуральное число.
Формат выходных данных
Выведите ответ на задачу.

Sample Input:
50
Sample Output:
1 2 4 8 16 32
int a, sqr;
cin >> a;
sqr = 1;
while (sqr <= a) {
    cout << sqr << " ";
    sqr = sqr * 2;
}

Задача №4

Дано натуральное число $%N$%. Выведите слово YES, если число $%N$% является точной степенью двойки, или слово NO в противном случае.
Формат входных данных
Вводится натуральное число.
Формат выходных данных
Выведите ответ на задачу.

Sample Input 1:
1
Sample Output 1:
YES

Sample Input 2:
2
Sample Output 2:
YES
int a;
cin >> a;
while (a > 1) {
    if (a % 2 == 0) a = a / 2;
    else break;
}
if (a > 1) cout << "NO";
else cout << "YES";

Задача №5

Программа получает на вход последовательность целых неотрицательных чисел, каждое число записано в отдельной строке.
Последовательность завершается числом 0, при считывании которого программа должна закончить свою работу и вывести количество членов последовательности (не считая завершающего числа 0).
Числа, следующие за числом 0, считывать не нужно.
Формат входных данных
Вводится последовательность целых чисел, заканчивающаяся числом 0.
Формат выходных данных
Выведите ответ на задачу.

Sample Input:
1 7 9 0 5
Sample Output:
3
int a, i;
a = -1;
i = 0;
while (a != 0) {
    cin >> a;
    if (a == 0) break;
    i = i + 1;
}
cout << i;

Задача №6

Определите сумму всех элементов последовательности, завершающейся числом 0.
Формат входных данных
Вводится последовательность целых чисел, оканчивающаяся числом 0 (само число 0 в последовательность не входит, а служит как признак ее окончания.
Формат выходных данных
Выведите ответ на задачу.

Sample Input:
3 6 8 0
Sample Output:
17
int a, i;
a = -1;
i = 0;
while (a != 0) {
    cin >> a;
    if (a == 0) break;
    i = i + a;
}
cout << i;

Задача №7

Последовательность состоит из натуральных чисел и завершается числом 0. Определите, какое количество элементов этой последовательности, равны ее наибольшему элементу.
Формат входных данных
Вводится последовательность целых чисел, оканчивающаяся числом 0 (само число 0 в последовательность не входит, а служит как признак ее окончания).
Формат выходных данных
Выведите ответ на задачу.

Sample Input:
1 3 3 1 0

Sample Output:
2
int a, i, c;
a = -1;
i = 0;
c = 0;
while (a != 0) {
    cin >> a;
    if (a == 0) break;
    if (i < a) {
        i = a;
        c = 1;
    }
    else if (i == a) c = c + 1;
}
cout << c;

Задача №8

Последовательность состоит из натуральных чисел и завершается числом 0. Определите значение второго по величине элемента в этой последовательности, то есть элемента, который будет наибольшим, если из последовательности удалить наибольший элемент.
Формат входных данных
Вводится последовательность целых чисел, оканчивающаяся числом 0 (само число 0 в последовательность не входит, а служит как признак ее окончания).
Формат выходных данных
Выведите ответ на задачу.

Sample Input 1:
4 4 2 3 0
Sample Output 1:
4

Sample Input 2:
2 1 0
Sample Output 2:
1
int a, b, max, pred_max;
cin >> a >> b;
if (a >= b) {
    max = a;
    pred_max = b;
}
else {
    max = b;
    pred_max = a;
}
while (a != 0) {
    cin >> a;
    if (a == 0) break;
    if (max <= a) {
        pred_max = max;
        max = a;
    }
    else if (pred_max < a) {
        pred_max = a;
    }
}
cout << pred_max;

Задача №9

Последовательность Фибоначчи определяется так:$$F(0) = 0, F(1) = 1, …, F(n) = F(n−1) + F(n−2)$$ По данному числу $%n$% определите $%n$%-е число Фибоначчи $%F(n)$%.
Формат входных данных
Вводится натуральное число $%n$%.
Формат выходных данных
Выведите ответ на задачу.

Sample Input:
6
Sample Output:
8
int n, ff0, i = 1, f = 1, f0 = 0;
cin >> n;
while (i < n) {
    ff0 = f;
    f = f0 + f;
    f0 = ff0;
    i = i + 1;
}
cout << f;

Задача №10

Дана последовательность натуральных чисел, завершающаяся числом 0. Определите, какое наибольшее число подряд идущих элементов этой последовательности равны друг другу.
Формат входных данных
Вводится последовательность натуральных чисел, оканчивающаяся числом 0 (само число 0 в последовательность не входит, а служит как признак ее окончания).
Формат выходных данных
Выведите ответ на задачу.

Sample Input:
1 7 7 9 1 0
Sample Output:
2
int a, a0, eq, max_eq;
cin >> a0;
a = -1;
eq = 1;
max_eq = 0;
while (a != 0) {
    cin >> a;
    if (a0 == a) eq = eq + 1;
    else eq = 1;
    if (max_eq < eq) max_eq = eq;
    a0 = a;
    if (a == 0) break;
}
cout << max_eq;

Задача №11

Элемент последовательности называется локальным максимумом, если он строго больше предыдущего и последующего элемента последовательности. Первый и последний элемент последовательности не являются локальными максимумами.
Дана последовательность натуральных чисел, завершающаяся числом 0. Определите количество строгих локальных максимумов в этой последовательности.
Формат входных данных
Вводится последовательность целых чисел, оканчивающаяся числом 0 (само число 0 в последовательность не входит, а служит как признак ее окончания).
Формат выходных данных
Выведите ответ на задачу.

Sample Input:
1 2 1 2 1 0
Sample Output:
2
int a_prev, a, a_post, loc_max;
loc_max = 0;
cin >> a_prev >> a;
if (a == 0) {
    cout << loc_max;
    return 0;
}
cin >> a_post;
if (a_post == 0) {
    cout << loc_max;
    return 0;
}
if (a > a_prev && a > a_post) loc_max = loc_max + 1;
while (a_post != 0) {
    a_prev = a;
    a = a_post;
    cin >> a_post;
    if (a_post == 0) break;
    if (a > a_prev && a > a_post) loc_max = loc_max + 1;
}
cout << loc_max;

Задача №12

Определите наименьшее расстояние между двумя локальными максимумами последовательности натуральных чисел, завершающейся числом 0. Если в последовательности нет двух локальных максимумов, выведите число 0.
Начальное и конечное значение при этом локальными максимумами не считаются.
Формат входных данных
Вводится последовательность целых чисел, оканчивающаяся числом 0 (само число 0 в последовательность не входит, а служит как признак ее окончания).
Формат выходных данных
Выведите ответ на задачу.

Sample Input 1:
1 2 1 1 2 1 2 1 0
Sample Output 1:
2
int a_prev, a, a_post, loc_max_1 = 0, loc_max_2 = 0, r_loc_min = INT32_MAX, i = 1;
cin >> a_prev >> a;
i = i + 1;
if (a == 0) {
    cout << 0;
    return 0;
}
cin >> a_post;
i = i + 1;
if (a_post == 0) {
    cout << 0;
    return 0;
}
if (a > a_prev && a > a_post) {
    loc_max_1 = i - 1;
}
while (a_post != 0) {
    a_prev = a;
    a = a_post;
    cin >> a_post;
    i = i + 1;
    if (a_post == 0) break;
    if (a > a_prev && a > a_post) {
    if (loc_max_2 > 0) {
        loc_max_1 = loc_max_2;
    }
        loc_max_2 = i - 1;
    }
    if (loc_max_2 - loc_max_1 < r_loc_min && loc_max_2 > 0 && loc_max_1 > 0) {
        r_loc_min = loc_max_2 - loc_max_1;
    }
}
if (r_loc_min == INT32_MAX) {
    cout << 0;
}
else {
    cout << r_loc_min;
}

Массивы и цикл for на C++ Понесло на C++

1     0

blog comments powered by Disqus