学习笔记-第三次课后习题-循环结构总结

学习笔记-第三次课后习题-循环结构总结

HuaLiMao-AQ Lv1

Problem 1 整数逆序

问题描述:

1
输入一个整数n,求他的逆序数。例如输入12000,则输出逆序数21

输入描述:

1
一个整数

输出描述:

1
该数的逆序列

样例输入:

1
-12345

样例输出:

1
-54321

思路分析:

​ 很明显,这题的整数是包含负整数,零和正整数,但是这并不影响我们去处理它。

​ 这题思路很简单,拆分倒序重组就可以了

代码实现:

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

int main()
{
int after;
int change = 0;

scanf("%d", &after);
while (after!=0)
{
change = change*10+after%10;
after /= 10;
}
printf("%d\n", change);

return 0;
}

Problem 2 最值及平均数

问题描述:

1
输入n个整数,找出其中的最小值和最大值,并计算此n个数的平均值,输出他们

输入描述:

1
第1行:一个正整数n(n<=12)第2行:n个整数(可正可负,均不超过int范围)

输出描述:

1
共3行,第一行输出n个整数的平均值(保留2位小数),第二行输出最小值,第三行输出最大值。

样例输入:

1
2
5
4 5 8 1 3

样例输出:

1
2
3
4.20
1
8

思路分析:

​ 这道题没什么好分析的,主要就是循环找最大值与最小值并且求平均数

代码实现:

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
#include <stdio.h>

int main()
{
int n, data, max, min;
double sum = 0, avg;

scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%d", &data);
if(i==0) {
max=data;
min=data;
} else {
if (data > max) max = data;
if (data < min) min = data;
}
sum += data;
}
avg = sum/n;
printf("%.2lf\n%d\n%d\n", avg, min, max);

return 0;
}

Problem 3 求满足条件的n

问题描述:

1
公式s(n)=1^2+2^2+···+n^2,对于给定的正整数,求满足条件的最大整数n,使得s(n)<=m,s(n+1)>=m

输入描述:

1
输入正整数m。

输出描述:

1
输出满足条件的最大整数

样例输入:

1
90

样例输出:

1
5

思路分析:

​ 这道题简单的写法,就是循环找数,只要满足这个条件,就跳出循环

代码实现:

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

int main()
{
int m, sum = 0, n = 1;

scanf("%d", &m);
while (sum <= m) {
sum += n*n;
// 循环结束条件 s(n+1) >= m 并且 s(n) <= m
if (sum + (n+1)*(n+1) >= m) break;
n++;
}
printf("%d\n", n);

return 0;
}

Problem 4 猴子吃桃问题

问题描述:

1
猴子第一天摘下若干个桃子,当天吃了一半,后面又多吃一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。后面每天猴子都吃了前一天剩下的一半零一个。到第N天想再吃时,只剩下一个桃子。求第一天共摘了多少桃子。

输入描述:

1
一个正整数N,代表第N天

输出描述:

1
第一天摘下的桃子数

样例输入:

1
10

样例输出:

1
1534

思路分析:

​ 这道题是改编题:头哥实践教学平台-猴子吃桃问题 (PS: 需要登陆)

​ 这题的计算思路是 s(n) = s(n-1)/2-1,可知s(n-1)=(s(n)+1)x2,只要循环逆推到第一天就得到结果了

代码实现:

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

int main()
{
int n, sum = 1;

scanf("%d", &n);
// 实际上小猴子只吃了n-1天, 所以只要循环n-1次就可以了
for (int i = 0; i < n - 1; i++)
{
sum = (sum+1)*2;
}
printf("%d", sum);

return 0;
}

Problem 5 累加求和算

问题描述:

1
根据公式PI/2=1+1/3+1/3x2/5+1/3x2/5x3/7+1/3x2/5x3/7x4/9+···+1/3x···xn/(2n+1)计算PI的值。例如,当n为1时,根据公式计算的结果为2.6667

PS: PI=文本框里无法输入这个符号

输入描述:

1
一个正整n(1<=n<=10000),n代表公式中除1以外求和项的个数。

输出描述:

1
一个有4位小数的实数

样例输入:

1
1000

样例输出:

1
3.1416

思路分析:

​ 很明显,每一项是非常符合规律的,可以看作**a0=1,a1=a0x1/3, a2=a1x2/5,····,an=an-1xn/(2n+1)/2=a0+a1+a2+a3+···+an**按照这个思路我们就可以很好的解决这个题了

代码实现:

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

int main()
{
double PI = 1, n, a = 1;

scanf("%lf", &n);
for (int i = 1; i <= n; i++)
{
// 2.0和1.0是为了使最后的计算结果为double型
a=a*i/(2.0*i+1.0);
PI += a;
}
PI*=2;
printf("%.4lf\n", PI);

return 0;
}
  • 标题: 学习笔记-第三次课后习题-循环结构总结
  • 作者: HuaLiMao-AQ
  • 创建于 : 2024-10-22 22:00:00
  • 更新于 : 2024-10-23 12:59:28
  • 链接: https://blog.cat-boy.cn/2024/10/22/学习笔记-第三次课后习题-循环结构总结/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论