程序设计习题 第 3 章 做循环
3.1 单层循环
1. 输入一个正整数n,输出1,2,3……n-1,n
2. 计算2+4+6+……+100的和
3. 输入一个正整数n,计算n的阶乘
4. 计算1,2,3,……,100中所有奇数和偶数的和?
5. 编写程序,输出1~100之间每位数的乘积大于每位数的和的数
6. 请打印出所有三位数的水仙花数?
提示:
(1) 水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。(例如:1^3 + 5^3+ 3^3 = 153)
(2) for a,b,表示循环变量将从 a 变到 b
7. 求和 求s= a + aa + aaa + … + aa…a 的值(最后一个数中 a 的个数为 n ),其中 a 是一个1~9的数字,例如: 2 + 22 + 222 + 2222 + 22222 (此时 a=2 n=5 )
输入:一行,包括两个整数,第1个为a,第2个为n(1 ≤ a ≤ 9,1 ≤ n ≤ 9),以英文逗号分隔。
输出:一行,s的值。
输入例子:2,5 对应输出:24690
8. 输入一个大于1的正整数,并判断该正整数是否是素数。如果是素数,输出Yes;如果不是素数,输出其因子的个数
提示1:质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数
提示2:因数是指如果整数a除以整数b(b≠0) 的商正好是整数而没有余数,则b就是a的因数
9. 计算级数:S=1+1/3+1/5+1/7+……的前100项之和
10. 编程计算表达式
3.2 多层循环
1. 求数字2~50之间每个数的因数
2. 计算半径从1到10,且面积小于100的圆形面积
3. 编写程序,打印下列图形
提示:用output()和output@s()来控制加不加回车
*********
********
*******
******
*****
****
***
**
*
4. 编写程序打印下列菱形图案。菱形的行数可输入,不同的行数,菱形的大小不同。
5. 使用for和break语句编写程序,判断任意一个大于1的正整数是否为素数。是输出Yes,不是输出No
6. 求100~200之间的全部素数
7. 一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3。编程找出1000以内的所有完数
8. 口袋中有红、黄、蓝、白、黑五种颜色的球若干。每次从口袋中取出3个不同颜色的球,问有多少种取法。
(1)3个球有顺序,红、黄、蓝和蓝、黄、红为不同取法
(2)3个球无顺序,红、黄、蓝和蓝、黄、红为相同取法
3.3 条件循环
1. 输入一个正整数,并将其逆序输出。例如:输入12345,则输出54321
2. 输入一个正整数,并判断其是否是对称数(回文数)。如果是输出Yes;如果不是输出No
提示:对称数是指将数字倒过来之后与原数相同。例如,12321是对称数,12345不是对称数
3. 输入一个正整数,将这个正整数中每一位上是奇数的数依次取出,后将取出的数字按原有的顺序排列构成一个新的正整数并输出
提示:若原数为1215348,则构成的新数为1153
4. 输出1000以内的素数
5. 公鸡每只值5钱,母鸡每只值3 钱,而3 只小鸡值1 钱。用100钱买100 只鸡,问:这100 只鸡中,公鸡、母鸡和小鸡各有多少只?
6. 下列程序的输出结果是什么?
A |
B |
C |
D |
|
1 |
for 5 |
|||
2 |
for 2 |
|||
3 |
if A1==2 |
next A1 |
||
4 |
if A1==4 |
break A1 |
||
5 |
>output(A1) |
3.4 死循环
1. 计算圆的面积,半径取值1,2,3,……直到面积值大于1000为止
2. 用死循环的方式编写程序,计算的近似值,公式: ,直至最后一项的绝对值不大于为止。
3. 用泰勒公式,计算自然对数底数 e 的近似值,直至最后一项的绝对值不大于为止。
参考答案:
3.1 单层循环
1.
A |
B |
|
1 |
100 |
|
2 |
for A1 |
>output(A2) |
2.
A |
B |
|
1 |
=0 |
|
2 |
for 50 |
>A1+=2*A2 |
计算结果存入A1
3.
A |
B |
|
1 |
10 |
1 |
2 |
for A1 |
>B1=B1*A2 |
计算结果存入B1
4.
A |
B |
C |
|
1 |
0 |
0 |
|
2 |
for 100 |
if A2%2!=0 |
>A1+=A2 |
3 |
else |
>B1+=A2 |
A1 奇数和
B1 偶数和
5.
A |
B |
C |
|
1 |
for 100 |
=A1%10 |
|
2 |
=A1\10 |
||
3 |
if B1*B2>B1+B2 |
>output(A1) |
6.
A |
B |
C |
|
1 |
for 100,999 |
=A1\100 |
/百位 |
2 |
=A1\10%10 |
/十位 |
|
3 |
=A1%10 |
/个位 |
|
4 |
if B1*B1*B1+ B2*B2*B2+ B3*B3*B3==A1 |
>output(A1) |
7.
A |
B |
|
1 |
2 |
5 |
2 |
0 |
0 |
3 |
for B1 |
>A2=A2+A1 |
4 |
>B2=B2+A2 |
|
5 |
>A1=A1*10 |
A2 每次循环要加的数值如22222
B2 求和结果
8.
A |
B |
C |
|
1 |
97 |
0 |
|
2 |
for A1 |
if A1%A2==0 |
>B1+=1 |
3 |
=if(B1==2,output("Yes"),output(B1)) |
9.
A |
B |
|
1 |
0 |
|
2 |
for 100 |
>A1+=1/(2*A2-1) |
10.
A |
B |
|
1 |
100 |
|
2 |
for A1 |
>B1+=A2*A2 |
3 |
>B1=1/A1*B1 |
A1 输入n的值
B1保存计算结果
3.2 多层循环
1.
A |
B |
C |
D |
|
1 |
for 2,50 |
>output("Factors of"/A1/":") |
||
2 |
for A1 |
if A1%B2==0 |
>output(B2) |
2.
A |
B |
C |
|
1 |
for 1,10 |
=3.14*A1*A1 |
|
2 |
if B1>100 |
break |
|
3 |
>output(A1,B1) |
||
4 |
>output("When r="/A1/", S>100") |
3.
A |
B |
C |
|
1 |
9 |
||
2 |
for A1 |
for A1+1-A2 |
>output@s("*") |
3 |
>output("") |
4.
A |
B |
C |
|
1 |
9 |
||
2 |
for A1\2+1 |
for A1\2+1-A2 |
>output@s(" ") |
3 |
for 2*A2-1 |
>output@s("*") |
|
4 |
for A1\2+1-A2 |
>output@s(" ") |
|
5 |
>output("") |
||
6 |
for A1\2 |
for A6 |
>output@s(" ") |
7 |
for A1-2*A6 |
>output@s("*") |
|
8 |
for A6 |
>output@s(" ") |
|
9 |
>output("") |
5.
A |
B |
C |
|
1 |
173 |
||
2 |
for 2,A1-1 |
if A1%A2==0 |
break |
3 |
=if(A2==A1,output("Yes"),output("No")) |
6.
A |
B |
C |
D |
|
1 |
for 100,200 |
|||
2 |
for 2,A1-1 |
if A1%B2==0 |
break |
|
3 |
=if(B2==A1,output(A1)) |
7.
A |
B |
C |
D |
|
1 |
0 |
|||
2 |
for 1000 |
|||
3 |
for A2-1 |
if A2%B3==0 |
>A1+=B3 |
|
4 |
if A1==A2 |
>output(A2) |
||
5 |
>A1=0 |
8.
(1)
A |
B |
C |
D |
E |
F |
|
1 |
0 |
|||||
2 |
for 5 |
|||||
3 |
for 5 |
if B3!=A2 |
||||
4 |
for 5 |
if D4!=B3 && D4!=A2 |
>A1+=1 |
计算结果保存在A1,60种取法
(2)
A |
B |
C |
D |
|
1 |
0 |
|||
2 |
for 5 |
|||
3 |
for A2-1 |
|||
4 |
for B3-1 |
>A1+=1 |
计算结果保存在A1,10种取法
3.3 条件循环
1.
A |
B |
|
1 |
12345 |
|
2 |
for A1!=0 |
>B1=B1*10+A1%10 |
3 |
>A1=A1\10 |
B1 存储输出结果
2.
A |
B |
|
1 |
12321 |
|
2 |
=A1 |
|
3 |
for A2!=0 |
>B1=B1*10+A2%10 |
4 |
>A2=A2\10 |
|
5 |
=if(A1==B1,output("Yes"),output("No")) |
3.
A |
B |
C |
|
1 |
1215348 |
||
2 |
1 |
||
3 |
for A1!=0 |
=A1%10 |
|
4 |
if B3%2!=0 |
>B1=B1+B3*A2 |
|
5 |
>A2=A2*10 |
||
6 |
>A1=A1\10 |
B1 存储输出结果
A2 用于存储每次循环后的数位
4.
A |
B |
C |
D |
|
1 |
for 1000 |
if A1==2 |
>output(A1) |
|
2 |
for 2, A1-1 |
if A1%B2==0 |
next A1 |
|
3 |
>output(A1) |
5.
A |
B |
C |
D |
|
1 |
for 100 |
if 5*A1>100 |
break |
|
2 |
for 100-A1 |
=100-A1-B2 |
=5*A1+3*B2+C2/3 |
|
3 |
if D2>100 |
next A1 |
||
4 |
else if D2<100 |
next |
||
5 |
>output(A1,B2,C2) |
在代码中,A1循环公鸡的总数;在B1中判断,如果公鸡的总价已经超过100,说明公鸡的总数已经太多了,此时在C1中用break命令终止循环。B2中继续循环母鸡可能的总数。在D3中,如果发现当前鸡的总价已经超过了100,说明在当前母鸡总数已经太多了,可以用next A1,增加公鸡的总数,重新尝试。在D4中,当前鸡的总价还小于100,可以继续增加母鸡的总数来尝试,这里的next命令会跳过当前最内层的循环代码,即以B2为主格的循环。
3.4 死循环
1.
A |
B |
C |
D |
|
1 |
1 |
|||
2 |
for |
=3.14*A1*A1 |
if B2>1000 |
break |
3 |
>output(A1,B2) |
|||
4 |
>A1+=1 |
2.
A |
B |
C |
D |
|
1 |
1 |
1 |
||
2 |
for |
=A1/B1 |
if abs(B2)<=number("1E-8") |
break |
3 |
>C1+=B2 |
|||
4 |
>A1*=-1 |
|||
5 |
>B1+=2 |
|||
6 |
>output(4*C1) |
3.
A |
B |
C |
|
1 |
=1 |
=1 |
1 |
2 |
for |
>C1=C1*B1 |
|
3 |
if 1/C1<=number("1E-8") |
break |
|
4 |
>A1=A1+1/C1 |
||
5 |
>B1+=1 |
||
6 |
>output(A1) |
大佬们,请教一个问题:
3.4.2 计算π近似值 1-1/3+1/5-1/7+…至最后一项的绝对值不大于 1E-8,此时 for 循环了 5 千万次,本机 (4C16G JVM13G) 运行录得时间在 12 秒左右。
我换了一个写法:
=s=-1,5e7.((s*=-1)/(~*2-1)).sum(),这个语句在本机运行录得时间为 26.9 秒;
然后,尝试了用 @m,不知道此处使用 @m 对不对,结果貌似是对的:
=s=-1,5e7.@m((s*=-1)/(~*2-1)).sum(),这个语句在本机运行录得时间为 27.7 秒,反而更慢了。
用以下 iterate 语句,本机录得耗时在 9 秒左右 (这个耗时我觉得是正常的),但有时也会跑出 27 秒
=5e7.iterate([~~(1)*-1,~~(1)/(~*2-1)+~~(2)],[1,0])
所以:
1、for 循环和函数循环在此处的执行效率相差很大,这两种循环方式的效率应该相差不大吧?是不是我哪里写的不合适?好像在官网哪里看见过这样的论述:代码网格的解释运行也是有开销的,所以网格要尽量紧凑,减少网格的解释开销,能用循环函数解决的场景尽量使用循环函数。
2、A.@m()和 A.run@m() 之前有大佬说过会判断序列长度,5e7 还不够长度要求吗?
恳请大佬得闲时给予指导帮助!谢谢!
而且,本机测试时,同样的循环迭代语句,WIN 版本和 MAC 版本耗时差异很大。跑了好几遍,MAC 版没有跑进过 10 秒,WIN 版不怎么稳定,有时也会出现二三十秒的现象。如下图所示:
1 对,2 不能 @m
这些地方不会被关注的,实际业务中用不到这类场景中做性能优化,这些也不涉及算法,有可能有些实现问题导致某些情况下不如预期,但因为没啥实用价值,也懒得去细抠它了。
如果想训练性能优化技术,https://c.raqsoft.com.cn/article/1615765346560#toc_h2_0 这里有些实践问题更好,都有实际的背景。
谢谢老贼解惑,谢谢 someone 大佬🙏 🙏
SPL 实践系列文章确实是实践指南,一定仔细学习。还有您写的一系列文章,都看了不下 5 遍了。😄 😄
不纠结了,周末愉快!!
英文版