《算法笔记》2.4小节——C/C++快速入门->循环结构

问题 A: 例题5-1-1 连续自然数求和

题目

题目描述

求 1+2+3+...+100,即求 \[ \sum_{i=1}^{100}{i} \] 要求用 while 语句实现。

输入

输出

要求的和,末尾输出换行。

样例输入

1

样例输出

1
5050

题解

思路

直接写就好。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <stdio.h>
#include <math.h>

using namespace std;

int main()
{
int sum = 0, i = 1;

while (i < 101)
{
sum += i;
i++;
}
printf("%d", sum);

system("pause");
return 0;
}

问题 B: 例题5-1-2 连续自然数求和

题目

题目描述

求 1+2+3+...+100,即求 \[ \sum_{i=1}^{100}{i} \] 要求用 do...while 语句实现。

输入

输出

计算结果,末尾输出换行。

样例输入

1

样例输出

1
5050

题解

思路

直接写就好。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <stdio.h>
#include <math.h>

using namespace std;

int main()
{
int sum = 0, i = 1;
do
{
sum += i;
i++;
} while (i < 101);
printf("%d", sum);

system("pause");
return 0;
}

问题 C: 例题5-1-3 连续自然数求和

题目

题目描述

求 1+2+3+...+100,即求 \[ \sum_{i=1}^{100}{i} \] 要求用 for 语句实现。

输入

输出

计算结果,末尾输出换行。

样例输入

1

样例输出

1
5050

题解

思路

直接写就好。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <stdio.h>
#include <math.h>

using namespace std;

int main()
{
int sum = 0;
for (int i = 1; i < 101; i++)
{
sum += i;
}
printf("%d", sum);

system("pause");
return 0;
}

问题 D: 例题5-1-4 连续自然数求和

题目

题目描述

求 1+2+3+...+100,即求 \[ \sum_{i=1}^{100}{i} \] 要求在程序中使用break语句。

输入

要求输入的数据一定是一个正整数。

输出

计算的结果,连续N个自然数的和,末尾输出换行。

样例输入

1
100

样例输出

1
5050

题解

思路

需要用到break语句,那么可以使用whileif-else的结合。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <stdio.h>
#include <math.h>

using namespace std;

int main()
{
long long n = 0;
long long sum = 0;
scanf("%d", &n);
long long i = 1;
while (true)
{
if (i <= n)
{
sum += i;
i++;
}
else
{
break;
}
}
printf("%lld\n", sum);

system("pause");
return 0;
}

问题 E: 例题5-1-5 连续自然数求和

题目

题目描述

编程实现求 1+2+3+... 和的程序,要求得到使和数大于1000的最小正整数。

输入

输出

输出使 1+2+3+...+N>1000 的最小正整数 N,末尾输出换行。

样例输入

1

样例输出

1
45

题解

思路

使用for循环+if语句就好啦。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <stdio.h>
#include <math.h>

using namespace std;

int main()
{
int sum = 0;
for (int i = 1; i < 100; i++)
{
sum += i;
if (sum > 1000)
{
printf("%d\n", i);
break;
}
}

system("pause");
return 0;
}

问题 F: 例题5-6 矩阵输出

题目

题目描述

输出以下 4*5 的矩阵

1 2 3 4 5

2 4 6 8 10

3 6 9 12 15

4 8 12 16 20

要求使用循环实现,注意每行输出 5 个数字,每个数字占 3 个字符的宽度,右对齐。

输入

输出

每行输出 5 个数字,每个数字占 3 个字符的宽度,右对齐。

样例输入

1

样例输出

1
2
3
4
1  2  3  4  5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20

题解

思路

用数组即可。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <stdio.h>
#include <math.h>

using namespace std;

int main()
{
int a[][5] = {{1, 2, 3, 4, 5}, {2, 4, 6, 8, 10}, {3, 6, 9, 12, 15}, {4, 8, 12, 16, 20}};
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 5; j++)
{
printf("%3d", a[i][j]);
}
printf("\n");
}

system("pause");
return 0;
}

问题 G: 例题5-7 求圆周率pi的近似值

题目

题目描述

用如下公式 \[ \frac{π}{4}≈1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+\cdots \]

求圆周率PI的近似值,直到发现某一项的绝对值小于 10-6 为止(该项不累加)。

要求输出的结果总宽度占 10 位,其中小数部分为 8 位。

程序中使用浮点型数据时,请定义为双精度 double 类型。

如果需要计算绝对值,可以使用 C 语言数学库提供的函数 fabs,如求 x 的绝对值,则为 fabs(x).

输入

输出

PI = 圆周率的近似值

输出的结果总宽度占 10 位,其中小数部分为 8 位。

末尾输出换行。

样例输入

1

样例输出

1
PI=3.14159065

题解

思路

其实不是很复杂,分解一下:

  • 结果PI
  • 每一项:1 \ nn = n + 2,还要注意变号

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <stdio.h>
#include <math.h>

using namespace std;

int main()
{
double PI = 0;
double n = 1.0;
double t = 1 / n;
double sign = 1;
while (fabs(t) >= 1e-6)
{
PI = PI + t * sign;
sign = -sign;
n = n + 2;
t = 1 / n;
}
printf("PI=%10.8f\n", PI * 4);

system("pause");
return 0;
}

问题 H: 例题5-8 Fibonacci数列

题目

题目描述

输入一个正整数 n,求 Fibonacci 数列的第 n 个数。Fibonacci 数列的特点:第 1,2 个数为 1,1。从第 3 个数开始,概述是前面两个数之和。即: \[ \begin{equation} \left\{ \begin{array}{lr} F_1=1, & (n=1) \\ F_2=1, & (n=2) \\ F_n = F_{n-1}+F_{n-2}, & (n ≥ 3) \end{array} \right. \end{equation} \] 要求输入的正整数 n 不超过 50.

输入

一个不超过 50 的正整数

输出

Fibonacci 数列的第 n 个数,末尾输出换行。

样例输入

1
20

样例输出

1
6765

题解

思路

递归就好了,试了一下 Java 也不会超时。

代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <stdio.h>
#include <math.h>

using namespace std;

int Fibonacci(int i)
{
switch (i)
{
case 1:
case 2:
return 1;
default:
return Fibonacci(i - 1) + Fibonacci(i - 2);
}
}

int main()
{
int n;
scanf("%d", &n);
printf("%d\n", Fibonacci(n));

system("pause");
return 0;
}

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.util.Scanner;

public class Main {

public static void main(String[] args) {
int n;
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
System.out.println(Fibonacci(n));
}

public static int Fibonacci(int i) {
switch (i) {
case 1:
case 2:
return 1;
default:
return Fibonacci(i - 1) + Fibonacci(i - 2);
}
}
}

问题 I: 习题5-10 分数序列求和

题目

题目描述

有如下分数序列 \[ \frac{2}{1},\frac{3}{2},\frac{5}{3},\frac{8}{5},\frac{13}{8},\frac{21}{13},\cdots \] 求出次数列的前 20 项之和。

请将结果的数据类型定义为 double 类型。

输入

输出

小数点后保留 6 位小数,末尾输出换行。

样例输入

1

样例输出

1
32.660261

题解

思路

根据公式正常计算就好。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <stdio.h>
#include <math.h>

using namespace std;

int main()
{
int a = 2, b = 1;
double res = 0;
for (int i = 0; i < 20; i++)
{
res += 1.0 * a / b;
int temp = a;
a = a + b;
b = temp;
}
printf("%f\n", res);

system("pause");
return 0;
}

《算法笔记》2.4小节——C/C++快速入门->循环结构
https://excelius.xyz/《算法笔记》2-4小节——c-c-快速入门-循环结构/
作者
Ther
发布于
2021年10月31日
许可协议