第四次作业答案
This commit is contained in:
parent
c72704c598
commit
56c07da12c
1 changed files with 210 additions and 0 deletions
210
source/_posts/answer4.md
Normal file
210
source/_posts/answer4.md
Normal file
|
@ -0,0 +1,210 @@
|
|||
---
|
||||
title: 第四次作业(答案)
|
||||
mathjax: true
|
||||
date: 2020-11-06 09:57:17
|
||||
tags:
|
||||
---
|
||||
|
||||
|
||||
# P137-3
|
||||
|
||||
```C
|
||||
#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*}
|
||||
$$
|
||||
|
||||
由此,我们编写程序:
|
||||
|
||||
```C
|
||||
#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}$ 可以作为一个近似解。
|
||||
|
||||
```C
|
||||
#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
|
||||
|
||||
```C
|
||||
#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 (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 <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;
|
||||
}
|
||||
```
|
Loading…
Reference in a new issue