C_TA_Website/source/_posts/answer4.md

3.6 KiB

title mathjax date tags
第四次作业(答案) true 2020-11-06 09:57:17

P137-3

#include <stdio.h>
#include <stdlib.h>

int main()
{
    // 输入        
    printf("最大公约数与最小公倍数计算");
    int m, n;
    printf("请输入正整数m和n:\nm = ");
    if (scanf("%d", &m) != 1 || m <= 0) {
        fprintf(stderr, "非法输入!\n");
        exit(EXIT_FAILURE);
    }
    printf("n = ");
    if (scanf("%d", &n) != 1 || n <= 0) {
        fprintf(stderr, "非法输入!\n");
        exit(EXIT_FAILURE);
    }

    // a为较大者,b为较小者
    int a, b;
    if (m > n) {
        a = m;
        b = n;
    } else {
        a = n;
        b = m;
    }

    // 求最大公因数
    int t = 1;
    while (t != 0) {
        t = a % b;
        a = b;
        b = t;
    }

    // 最小公倍数
    int lcm = m * n / a;

    printf("最大公因数:%d\n最小公倍数:%d\n", a, lcm);
    return 0;
}

P137-5

\begin{align*} S_{n} &= a + aa + aaa + \cdots + \overbrace{aa \cdots a}^{n个a} \ &= a \times 10^{n - 1} + 2a \times 10^{n - 2} + \cdots + na \ &= (((a \times 10 + 2a) \times 10 + 3a) \times 10 + \cdots ) + na \end{align*}

由此,我们编写程序:

#include <stdio.h>

int main()
{
    int a, n;
    printf("P137-5\na = ");
    scanf("%d", &a);
    printf("n = ");
    scanf("%d", &n);

    int sum = a;

    for (int i = 2; i <= n; ++i) {
        sum *= 10;
        sum += a * i;
    }
    printf("S = %d\n", sum);
    return 0;
}

P138-14

迭代公式可表示为:

\begin{equation*} x_{n + 1} = x_{n} - \frac{f(x_{n})}{f'(x_{n})} \end{equation*}

\begin{equation*} f(x) = 2x^{3} - 4x^{2} + 3 x - 6 \end{equation*}

\begin{align*} f'(x) &= 6x^{2} - 8x + 3 \ x_{n + 1} &= x_{n} - \frac{f(x_{n})}{f'(x_{n})} \ &= x_{n} - \frac{2x_{n}^{3} - 4x_{n}^{2} + 3x_{n} - 6}{6x_{n}^{2} - 8x_{n} + 3} \ &= \frac{4x_{n}^{3} - 4x_{n}^{2} + 6}{6x_{n}^{2} - 8x_{n} + 3} \ \end{align*}

不妨设迭代的终止条件为:

\begin{equation*} |f(x_{n})| < 10^{-6} \end{equation*}

此时求得的 x_{n} 可以作为一个近似解。

#include <stdio.h>
#include <math.h>

int main()
{
    double t = 1e-6;
    double x = 1.5;
    while(fabs(2 * pow(x, 3) - 4 * pow(x, 2) + 3 * x - 6) >= t) {
        x = (4 * pow(x, 3) - 4 * pow(x, 2) + 6) / (6 * pow(x, 2) - 8 * x + 3);
    }
    printf("P138-14\nx = %.3f\n", x);
    return 0;
}

P138-15

#include <stdio.h>
#include <math.h>

int main()
{
    double a = -10, b = 10, c = 0;
    double t = 1e-6;
    double fa = 2 * pow(a, 3) - 4 * pow(a, 2) + 3 * a - 6;
    double fc = 2 * pow(c, 3) - 4 * pow(c, 2) + 3 * c - 6;
    while (fabs(2 * pow(c, 3) - 4 * pow(c, 2) + 3 * c - 6) >= t) {
        if (fa * fc < 0) {
            b = c;
        } else {
            a = c;
            fa = fc;
        }
        c = (a + b) / 2;
        fc = 2 * pow(c, 3) - 4 * pow(c, 2) + 3 * c - 6;
    }
    printf("P138-15\nx = %.3f\n", c);
    return 0;
}

选择排序

#include <stdio.h>
#include <math.h>

#define LEN 10

int main()
{
    printf("请输入%d个数字,用空格分隔:\n", LEN);
    int a[LEN];
    for (int i = 0; i < LEN; ++i) {
        scanf("%d", a + i);
    }
    for (int i = 0; i < LEN - 1; ++i) {
        int m = i;
        for (int j = i + 1; j < LEN; ++j) {
            if (a[j] < a[m]) {
                m = j;
            }
        }
        if (m != i) {
            int tmp = a[i];
            a[i] = a[m];
            a[m] = tmp;
        }
    }
    for (int i = 0; i < LEN; ++i) {
        printf("%d ", a[i]);
    }
    printf("\n");
    return 0;
}