diff --git a/source/_posts/answer4.md b/source/_posts/answer4.md new file mode 100644 index 0000000..19e69fc --- /dev/null +++ b/source/_posts/answer4.md @@ -0,0 +1,210 @@ +--- +title: 第四次作业(答案) +mathjax: true +date: 2020-11-06 09:57:17 +tags: +--- + + +# P137-3 + +```C +#include +#include + +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*} +$$ + +由此,我们编写程序: + +```C +#include + +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}$ 可以作为一个近似解。 + +```C +#include +#include + +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 + +```C +#include +#include + +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 (fabs(fc) < t) { + break; + } + 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; +} +``` + +# 选择排序 + +```C +#include +#include + +#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; +} +```