模拟多重循环
问题
请编写程序解答下面 10 个问题:
1、第一个答案是 b 的问题是哪一个?
(a)2;(b) 3;(c)4;(d)5;(e)6
2、唯一的连续两个具有相同答案的问题是:
(a)2,3;(b)3,4;(c)4,5;(d)5,6;(e)6,7;
3、本问题答案和哪一个问题的答案相同?
(a)1;(b)2;(c)4;(d)7;(e)6
4、答案是 a 的问题的个数是:
(a)0;(b)1;(c)2;(d)3;(e)4
5、本问题答案和哪一个问题的答案相同?
(a)10;(b)9;(c)8;(d)7;(e)6
6、答案是 a 的问题的个数和答案是什么的问题的个数相同?
(a)b;(b)c;(c)d;(d)e;(e)以上都不是
7、按照字母顺序,本问题的答案和下一个问题的答案相差几个字母?
(a)4;(b)3;(c)2;(d)1;(e)0。(注:a 和 b 相差一个字母)
8、答案是元音字母的问题的个数是:
(a)2;(b)3;(c)4;(d)5;(e)6。(注:a 和 e 是元音字母)
9、答案是辅音字母的问题的个数是:
(a)一个质数;(b)一个阶乘数;(c)一个平方数;(d)一个立方数;(e)5 的倍数
10、本问题的答案是:
(a)a;(b)b;(c)c;(d)d;(e)e
思路
大致思路:将问题中的 a,b,c,d,e 选项分别记录为 1,2,3,4,5,这样便于答案计增。首先把所有问题答案置 0,然后按顺序依次给每一个问题答案加 1,再通过题目中要求对各个答案进行判断,如果答案不符合某个题目的要求,则答案再加 1,直到符合为止。如果 5 个答案全部设置了一遍,仍然没有合适的答案,则返回去重新设置上一题的答案。遇到答案为 0 的题目直接跳过不做判断。
-
初始化 10 个问题答案为 0,问题序号为 1
-
从第一个问题开始循环,首先把问题答案加 1,判断本题答案是否为 6,如果为 6,说明已经超出 5 个答案了,则把本题答案置 0,i-1,重新回到上一题开始循环。
-
接着调用子函数判断所有问题答案是否合理,如果不合理则继续下一个循环
-
如果合理,则 i+1,然后判断 i 是否等于 11,如果等于 11,说明 10 个问题设置完毕,因此把最终答案转为字符串存起来,并把 i 置为 i-1 回到上一题继续循环,看看还有没有别的符合条件的答案,直到 i 等于 1 结束循环。
-
子函数逐题判断答案是否合理,判断顺序是先看本题或相关问题是否为 0,如果为 0 表明还没有设置答案,跳过判断;不为 0,则根据本题的题意进行判断。
代码
A | B | C | D | ||
1 | =[0]*10 | >i=1 | A1 用来存储 10 个问题的答案,初值为 0,i 为问题序号 | ||
2 | for i>0 | >A1(i)=A1(i)+1 | 将问题答案加 1 | ||
3 | if A1(i)==6 | >A1(i)=0,i=i-1 | next | 如果答案已经设置到了最后一个选项仍旧不对,则将当前问题答案置 0,返回上一问题,将上一问题答案加 1 重新循环 | |
4 | if !func(A8) | next | 调用函数,判断此次设置的答案是否合理,不合理的话进入下一次循环,继续把答案加 1 | ||
5 | >i=i+1 | 如果题目的答案设置合理,设置下一题的答案 | |||
6 | if i==11 | =C6|A1.(char(asc("a")+~-1)).concat() | >i=i-1 | 如果最后一题设完答案都合理,则把答案转为字母存到 C6,将 i 的值设置为 i-1,回到上一题看看还有没有别的符合要求的答案,直到 i 等于 1 为止,结束循环 | |
7 | |||||
8 | func | if A1(1)!=0 | 判断是否给第一题设置了答案 | ||
9 | =A1(A1(1)+1) | 按照第一题的答案,找到第一个答案为 b 的题目答案 | |||
10 | if C9!=0 && C9!=2 || A1(to(A1(1))).pos(2)>0 | return false | 如果 C9 中找到的题目设置的答案不是 b 或者在这个题目之前已经有一个题目的答案是 b 了,那么就返回 false | ||
11 | if A1(2)!=0 | =A1(2)+1 | 按照第二题的答案,找到唯一的连续两个具有相同答案的问题序号 | ||
12 | if A1(C11)*A1(C11+1)>0 && A1(C11)!=A1(C11+1) | return false | 如果 C11 中找到的题目设置的答案和相连的下一题的答案不相同,返回 false | ||
13 | if A1.pselect(~>0 && ~==~[1] && #!=C11)>0 | return false | 如果存在另外两个题目的答案相同,说明 C11 不是唯一的,返回 false | ||
14 | if A1(3)!=0 | =A1([1,2,4,7,6](A1(3))) | 按照第三题的答案,找到答案和第三题答案相同的问题答案 | ||
15 | if C14!=0 && C14!=A1(3) | return false | 如果 C14 不为 0 并且与第三题的答案不相同,返回 false | ||
16 | =A1.count(~==0) | =A1.count(~==1) | B16 计算出还没有设置答案的题目的个数 C16 计算出答案为 a 的题目的个数 | ||
17 | if A1(4)!=0 | =C16-A1(4)+1 | C16 减去第四题的答案,因为答案序号和答案值差 1,所以加 1 | ||
18 | if C17>0 || C17<0 && B16==0 | return false | 如果 C17 计算的结果大于 0,即设置的答案中为 a 的个数已经大于第四题中选择的个数,或者当题目全部设置了答案,但是 C17 仍然小于 0,即第四题中设置的所有题目中答案为 a 的个数大于实际答案为 a 的个数,返回 false | ||
19 | if A1(5)!=0 | =A1([10,9,8,7,6](A1(5))) | 按照第五题的答案,找到答案和第五题答案相同的问题答案 | ||
20 | if C19!=0 && C19!=A1(5) | return false | 如果 C19 不为 0 且与第五题的答案不相同,返回 false | ||
21 | if B16==0 | =A1.align@a([2,3,4,5]).(~.len()) | C21 计算答案分别为 2、3、4、5 的问题个数 | ||
22 | if !((A1(6)!=5 && C21(A1(6))==C16)|| (A1(6)==5 && C21.pos(C16)== null)) | return false | 如果第六题的答案为 5 且答案为 a 的个数和 C21 的所有问题个数都不同,则返回 true; 如果第六题答案不为 5 且其答案对应的问题个数和 C21 中的相符,则返回 true;其它情况返回 false | ||
23 | if A1(7)!=0 | if A1(8)!=0 && abs(A1(8)-A1(7))!=5-A1(7) | return false | 如果第八题已经设置了答案,并且第八题和第七题的答案相差的字母个数和第七题选择的答案不一致,返回 false | |
24 | if A1(8)!=0 | =C16+A1.count(~==5)-A1(8)-1 | 计算出答案为 a 和 e 的问题数之和与第八题答案的差 | ||
25 | if C24>0 || C24<0 && B16==0 | return false | 如果 C24 中计算的结果大于 0,即已有的元音字母的答案比第八题选择的个数多,或者当所有问题都设置了答案,但 C24 小于 0,即所有的问题都设置了答案但是元音字母的答案仍然比第八题选择的个数少,则返回 false | ||
26 | if B16==0 | [[2,3,5,7],[1,2,6],[0,1,4,9],[0,8],[0,5,10]] | C26 单元格定义了第九题各个选项可能的问题个数 | ||
27 | if C26(A1(9)).pos(A1.count(~>=2 && ~<=4))== null | return false | 如果计算出辅音字母的个数不在 C26 的序列中,则返回 false | ||
28 | return true | A1 用来存储 10 个问题的答案,初值为 0,i 为问题序号 |
英文版