Работа с действительными числами на C++

Михаил Попов    09.01.2016 13:58    C++ , Алгоритмы     нет комментариев

Действительные числа на C++

Как и обещал, выкладываю решение задач для школьников по C++. На этот раз будут рассмотрены задачи с действительными числами.

Задача №1

Дано положительное действительное число X. Выведите его дробную часть.
Формат входных данных
Вводятся положительное действительное число.
Формат выходных данных
Выведите ответ на задачу.

Sample Input:
17.9
Sample Output:
0.9
#include <iostream>
#include <cmath>

using namespace std;

int main() {
    double a;
    cin >> a;
    cout << a - trunc(a);
    return 0;
}

Задача №2

Дано положительное действительное число X. Выведите его первую цифру после десятичной точки.
Формат входных данных
Вводится положительное действительное число.
Формат выходных данных
Выведите ответ на задачу.

Sample Input:
1.79
Sample Output:
7
#include <iostream>
#include <cmath>
using namespace std;

int main() {
    double a;
    int f;
    cin >> a;
    f = trunc(a * 10);
    f = f % 10;
    cout << f;
    return 0;
}

Задача №3

Даны длины сторон треугольника. Вычислите площадь треугольника.
Формат входных данных
Вводятся три положительных числа.
Формат выходных данных
Выведите ответ на задачу.

Sample Input:
3 4 5
Sample Output:
6
#include <iostream>
#include <cmath>

using namespace std;

int main() {
    double a, b, c, p;
    cin >> a >> b >> c;
    p = (a + b + c) / 2;
    cout << sqrt(p *(p - a)*(p - b)*(p - c));
    return 0;
}

Задача №4

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

Sample Input:
12 179 0
Sample Output:
200 48
#include <iostream>
using namespace std;
int main() {
    int p, yy, x, y;
    cin >> p >> x >> y;
    yy = x * p % 100;
    x = x + x * p / 100;
    y = y + y * p / 100 + yy;
    x = x + y / 100;
    y = y % 100;
    cout << x << " " << y;
    return 0;
}

Задача №5

Процентная ставка по вкладу составляет P процентов годовых, которые прибавляются к сумме вклада через год. Вклад составляет X рублей Y копеек. Определите размер вклада через K лет.
Формат входных данных
Программа получает на вход целые числа P, X, Y, K.
Формат выходных данных
Программа должна вывести два числа: величину вклада через K лет в рублях и копейках. Дробное число копеек по истечение года отбрасывается. Перерасчет суммы вклада (с отбрасыванием дробных частей копеек) происходит ежегодно.
Примечание
В этой задаче часто возникают проблемы с точностью. Если они возникли у вас - попробуйте решить задачу в целых числах.

Sample Input:
12 179 0 5
Sample Output:
315 43
#include <iostream>

using namespace std;

int main() {
    int p, yy, x, y, k, i = 0;
    cin >> p >> x >> y >> k;
    while (i < k) {
        yy = x * p % 100;
        x = x + x * p / 100;
        y = y + y * p / 100 + yy;
        x = x + y / 100;
        y = y % 100;
        i = i + 1;
    }
    cout << x << " " << y;
    return 0;
}

Задача №6

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

Sample Input:
1 7 9 0
Sample Output:
5.66666666667
#include <iostream>
#include <iomanip>

using namespace std;

int main() {
    double a, med = 0, i = 0;
    while (a != 0) {
        cin >> a;
        if (a == 0) break;
        i = i + 1;
        med = med + a;
    }
    cout << fixed << setprecision(11);
    cout << (double) med / i ;
    return 0;
}

Задача №7

Дана последовательность натуральных чисел $%x_1, x_2, ..., x_n$%. Стандартным отклонением называется величина $$sigma = sqrt{frac{(x_1-s)^2+(x_2-s)^2+...+(x_n-s)^2}{n-1}}$$
где $$s = frac{x_1+x_2+...+x_n}{n}$$ - среднее значение последовательности.
Определите стандартное отклонение для данной последовательности натуральных чисел, завершающейся числом 0.
Формат входных данных
Вводится последовательность целых чисел, оканчивающаяся числом 0 (само число 0 в последовательность не входит, а служит как признак ее окончания). В последовательности не менее двух чисел до 0.
Формат выходных данных
Выведите ответ на задачу.

Sample Input:
1 7 9 0
Sample Output:
4.16333199893
#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

int main() {
    double n = -1, x = -1, s, sum = 0, sqr_x = 0, r;
    while (x != 0) {
        cin >> x;
        sum = sum + x;
        n = n + 1;
        sqr_x = sqr_x + x * x;
    }
    s = sum / n;
    r = sqrt((sqr_x + n * s * s - 2 * sum * s) / (n - 1));
    cout << fixed << setprecision(11);
    cout << r;
    return 0;
}

Задача №8

Дан многочлен $%P(x)=a_nx_n + a_{n−1}x_{n−1}+ ... + a_1x + a_0$% и число $%x$%. Вычислите значение этого многочлена, воспользовавшись схемой Горнера:
$$P(x)=(...(((a_nx + a_{n−1})x + a_{n−2})x + a_{n−3})...)x + a_0$$
Формат входных данных
Сначала программе подается на вход целое неотрицательное число n ≤ 20, затем действительное число x, затем следует $%n+1$% вещественное число — коэффициенты многочлена от старшего к младшему.
Формат выходных данных
Программа должна вывести значение многочлена.

Sample Input 1:
1
0.000
1.000
1.000
Sample Output 1:
1

Sample Input 2:
2 0.500 1.000 1.000 1.000
Sample Output 2:
1.75
#include <iostream>
#include <iomanip>
using namespace std;

int main() {
    int n, i;
    double x, a, s = 0;
    cin >> n;
    cin >> x;
    i = n + 1;
    while (i > 0) {
        cin >> a;
        s = s * x + a;
        i = i - 1;
    }
    cout << s;
    return 0;
}

Задача №9

Даны действительные коэффициенты $%a, b, c$%, при этом $%a ≠ 0$% . Решите квадратное уравнение $%ax^2 + bx + c = 0$% и выведите все его корни.
Формат входных данных
Вводятся три действительных числа.
Формат выходных данных
Если уравнение имеет два корня, выведите два корня в порядке возрастания, если один корень — выведите одно число, если нет корней — не выводите ничего.

Sample Input:
1 -1 -2
Sample Output:
-1 2
#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

int main() {
    double a, b, c, x1, x2, dis, zero;
    cout << setprecision(6) << fixed;
    zero = 1.0e-15;
    cin >> a >> b >> c;
    dis = b*b - 4*a*c;
    if (dis > zero) {
        // ответ есть
        x1 = (-b - sqrt(dis)) / (2 * a);
        x2 = (-b + sqrt(dis)) / (2 * a);
        if (x1 < x2) cout << x1 << " " << x2;
        else cout << x2 << " "  << x1;
    }
    else if (fabs(dis) <= zero) {
        if (fabs(b) <=  zero) cout << 0;
        else {
            x1 = -b / (2 * a);
            cout << x1;
        }
    };
    return 0;
}

Задача №10

Даны действительные коэффициенты a, b, c. Решите уравнение $%ax^2 + bx + c = 0$% и выведите все его корни.
Формат входных данных
Вводятся три действительных числа.
Формат выходных данных
Если данное уравнение не имеет корней, выведите число 0.
Если уравнение имеет один корень, выведите число 1, а затем этот корень.
Если уравнение имеет два корня, выведите число 2, а затем два корня в порядке возрастания.
Если уравнение имеет бесконечно много корней, выведите число 3.

Sample Input:
1 -1 -2
Sample Output:
2 -1 2
#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

int main() {
    double a, b, c, x1, x2, dis, zero;
    cout << setprecision(6) << fixed;
    zero = 1.0e-7;
    cin >> a >> b >> c;
    if (fabs(a) <= zero && fabs(b) <= zero && fabs(c) <= zero){
        cout << 3;
    }
    else if (not fabs(a) <= zero) {
        dis = b * b - 4 * a * c;
        if (dis > zero) { // есть 2 ответа
            cout << 2 << " ";
            x1 = (-b - sqrt(dis)) / (2 * a);
            x2 = (-b + sqrt(dis)) / (2 * a);
            if (x1 < x2) cout << x1 << " " << x2;
            else cout << x2 << " " << x1;
        }
        else if (fabs(dis) <= zero) { // есть 1 ответ
            cout << 1 << " ";
            if (fabs(b) <= zero) cout << 0;
            else {
                x1 = -b / (2 * a);
                cout << x1;
            }
        }
        else cout << 0; // ответа нет
    }
    else if (fabs(b) <= zero) cout << 0; // ответа нет
    else {
        cout << 1 << " ";
        if (fabs(c) <= zero) cout << 0; // ответа нет
        else {
            x1 = -c / b;
            cout << x1;
        }
    }
    return 0;
}

Задача №11

Даны вещественные числа a, b, c, d, e, f. Известно, что система линейных уравнений $$egin{cases}ax+by = e\cx+dy=fend{cases}$$ имеет ровно одно решение. Выведите два числа x и y, являющиеся решением этой системы.
Формат входных данных
Вводятся шесть чисел - коэффициенты уравнений системы.
Формат выходных данных
Выведите ответ на задачу.

Sample Input:
1 0 0 1 3 3
Sample Output:
3 3
#include <iostream>
#include <iomanip>

using namespace std;

int main() {
    double a1, b1, c1, a2, b2, c2, x1, x2, d, zero;
    cout << setprecision(6) << fixed;
    zero = 1.0e-7;
    cin >> a1 >> b1 >> a2 >> b2 >> c1 >> c2;
    d = a1 * b2 - a2 * b1; // Определитель матрицы
    x1 = (c1 * b2 - c2 * b1) / d;
    x2 = (c2 * a1 - c1 * a2) / d;
    cout << x1 << " " << x2;
    return 0;
}

Задача №12

Даны вещественные числа a, b, c, d, e, f. Решите систему линейных уравнений $$egin{cases}ax+by = e\cx+dy=fend{cases}$$
Формат входных данных
Вводятся шесть чисел - коэффициенты уравнений системы.
Формат выходных данных
Вывод программы зависит от вида решения этой системы.
Если система не имеет решений, то программа должна вывести единственное число 0.
Если система имеет бесконечно много решений, каждое из которых имеет вид $%y=kx+b$%, то программа должна вывести число 1, а затем значения $%k$% и $%b$%.
Если система имеет единственное решение $%(x_0, y_0)$%, то программа должна вывести число 2, а затем значения $%x_0$% и $%y_0$%.
Если система имеет бесконечно много решений вида $%x=x_0$%, $%y$% — любое, то программа должна вывести число 3, а затем значение $%x_0$%.
Если система имеет бесконечно много решений вида $%y=y_0$%, $%x$% — любое, то программа должна вывести число 4, а затем значение $%y_0$%.
Если любая пара чисел $%(x, y)$% является решением, то программа должна вывести число 5.

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

Sample Input 2:
1 1 2 2 1 2
Sample Output 2:
1 -1 1

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

Sample Input 4:
2 3 4 6 1 2
Sample Output 4:
1 -0.666667 0.333333

Sample Input 5:
0 1 0 3 5 15
Sample Output 5:
4 5

Sample Input 6:
1 0 1 0 3 3
Sample Output 6:
3 3
#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

int main() {
    double a, b, c, d, e, f, D, Dx, Dy, zero, x, y;
    cin >> a >> b >> c >> d >> e >> f;
    cout << setprecision(6) << fixed;
    zero = 1.0e-7;
    D = a * d - c * b; // Определитель матрицы
    Dx = e * d - f * b;
    Dy = a * f - c * e;
    if (not fabs(D) <= zero) {
        // Одно решение
        x = Dx / D;
        y = Dy / D;
        cout << 2 << " " << x << " " << y;
    }
    else {
        if (fabs(a) + fabs(b) + fabs(c) + fabs(d) <= zero) {
            if (fabs(e) + fabs(f) <= zero) cout << 5; // бесконечное множество решений
            else cout << 0; // решений нет
        }
        else if ((not fabs(Dx) <= zero) || (not fabs(Dy) <= zero)) cout << 0; // нет решений
        else if (b == 0) {
            if (not fabs(a) <= zero) cout << 3 << " " << e / a; // y - любое число
            else if (fabs(d) <= zero) cout << 3 << " " << f / c; // y - любое число
            else if (fabs(c) <= zero) cout << 4 << " " << f / d; // x - любое число
            else cout << 1 << " " << -c/d << " " << f/d; // y = kx + b
        }
        else if (a == 0) {
            if (not fabs(b) <= zero) cout << 4 << " " << e / b; // x - любое число
            else if (fabs(d) <= zero) cout << 3 << " " << f / c; // y - любое число
            else if (fabs(c) <= zero) cout << 4 << " " << f / d; // x - любое число
            else cout << 1 << " " << -c/d << " " << f/d; // y = kx + b
        }
        else cout << 1 << " " << -a/b << " " << e/b; // y = kx + b
    }
    return 0;
}

Двухмерные массивы на C++ Массивы и цикл for на C++

1     0

blog comments powered by Disqus